{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-docs/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Reefpay Docs","description":"Reefpay is the groundbreaking payment gateway that lets you integrate with the future of payments."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"api-changelog","__idx":0},"children":["API changelog"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["What changed in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["openapi.yaml"]},", and what you have to do about it."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Read this before you regenerate an SDK. Every published SDK is generated from this spec on every release, so a change"," ","here reaches your build whether or not you asked for it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-versions-work-during-beta","__idx":1},"children":["How versions work during beta"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The version lives in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["info.version"]}," and looks like ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1.0.0-beta.N"]},"."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["N increases by exactly one on every push that changes the spec."]}," No skips,"," ","no reuse, no batching. One push, one N."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["N carries no meaning beyond identity."]}," It tells you which build you compiled"," ","against. It does not tell you whether the change was safe."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Severity lives in this file, not in the number."]}," Read the categories below."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["At general availability the version drops to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1.0.0"]}," and switches to ordinary"," ","semantic versioning, where a major bump means a breaking change."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-the-categories-mean","__idx":2},"children":["What the categories mean"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Category"},"children":["Category"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What happened"},"children":["What happened"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What you do"},"children":["What you do"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Breaking"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Client code that was correct stops working"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Change your code before this version reaches your environment"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deprecated"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Still works, removal is scheduled"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Plan the work before the stated date"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Added"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["New optional surface"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Adopt when it is useful to you"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Corrected"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The document changed, the API did not"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Re-read if you built to the old text"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Corrected"]}," is the category to watch. Much of this spec was written ahead of the"," ","service, so a correction often means the API never behaved the way the document"," ","claimed. If you built to observed behavior you are fine. If you built to the"," ","document, you may have been broken all along and this change is what tells you."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-deprecations-work","__idx":3},"children":["How deprecations work"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A deprecation is a promise with a date on it."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Every bullet under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deprecated"]}," ends with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Removal: YYYY-MM-DD"]},". An"," ","open-ended deprecation is not permitted, and CI rejects one."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The default window is four weeks"]}," from the release that announces it. A"," ","shorter window needs the affected team's agreement; CI warns rather than fails,"," ","so the exception is visible instead of silent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["When the deprecated value appears on a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["response"]},", the old value keeps being"," ","returned for the whole window. Generated SDKs throw on a value they do not"," ","know, so a client on an older SDK breaks the moment the response changes — not"," ","when the enum grows. The announcement and the flip are separate releases, and"," ","both appear here."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"a-note-on-the-entries-before-beta23","__idx":4},"children":["A note on the entries before beta.23"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This file starts at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.19"]},". Everything from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.19"]}," through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.22"]}," is"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["reconstructed from git history"]},", because no changelog existed at the time and"," ","the version was not bumped per push — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.20"]}," alone covers 20 commits across"," ","six days. Treat those four entries as a good-faith summary rather than a record,"," ","and confirm anything you intend to rely on against the spec itself."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.23"]}," onward is written at the time of the change."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta27--2026-09-18","__idx":5},"children":["1.0.0-beta.27 — 2026-09-18"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Documentation only. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["No request or response changed"]},", and no field moved. One"," ","example value contradicted the constraint printed beside it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected","__idx":6},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_number"]}," no longer shows a six-character example against a four-character limit."]}," On the request side the field declares ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["maxLength: 4"]}," and its example"," ","read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"123456\""]},", so anyone who copied the example got a 400 from the gateway. The value left behind when the field was capped for"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.23"]},"; the cap moved and the example did not. It now reads ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"1234\""]},", which"," ","is what ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TsysIntegrationRequestExample"]}," in this same document has said all"," ","along. The nullable twin on the detail schema carries no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["maxLength"]},", so its"," ","example was legal but described a bank number TSYS never issues — it moved to"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"1234\""]}," as well, so the field reads the same everywhere."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Nothing about the contract changed. If you were sending a four-character"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_number"]},", as the constraint required, you were always correct."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta26--2026-09-17","__idx":7},"children":["1.0.0-beta.26 — 2026-09-17"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Documentation only. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["No request or response changed"]},", and nothing you built"," ","against ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.25"]}," needs touching. Three descriptions were wrong or silent about"," ","behavior the gateway has always had, and there is one new example."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Found while rewriting the developer portal's Payments section against this"," ","document."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added","__idx":8},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payout"]}," example on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/transactions"]},","]}," request and response. There"," ","was no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYOUT"]}," example before, so the only way to see the shape was to read"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BankAccountInput"]}," and infer it. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutRequestExample"]}," shows an ACH credit"," ","with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["standard_entry_class: CCD"]},"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutResponseExample"]}," shows the approved"," ","result, including the ACH return fields in their not-yet-returned state."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-1","__idx":9},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Tip"]}," now says how it relates to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount"]},"."]}," It never did, and the two"," ","readings differ by the size of the tip. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount"]}," is the whole charge and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tip"]}," ","declares how much of that charge is gratuity — a $100.00 bill with a $20.00"," ","tip is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount: 12000"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tip: 2000"]},". The tip is reported to the processor"," ","separately at settlement and never increases the settled amount. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If you were sending the pre-tip figure in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount"]},", you have been under-charging."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SaleRecurringSubsequentRequestExample"]}," no longer claims its rules are enforced by the schema."]}," They are not: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionCreateRequest"]}," and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RecurringDetails"]}," carry flat ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["required"]}," lists and no conditional validation,"," ","so a generated client accepts a request the gateway then rejects with 400"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INVALID_ACTION"]},". The rules are real and the gateway enforces them; only the"," ","attribution was wrong."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A subsequent recurring payment may carry either ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initial_transaction_id"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initial_network_transaction_id"]},"."]}," The same example said the first was"," ","required. It is not — the gateway accepts either, and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initial_network_transaction_id"]}," is the one to send when the agreement began"," ","outside this gateway."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta25--2026-09-16","__idx":10},"children":["1.0.0-beta.25 — 2026-09-16"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Payment method changes on both sides of the contract, plus the client request"," ","schemas. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Most of this is the document catching up with the service"]},", so read"," ","the Corrected section first — if you built to the old text rather than to"," ","observed behavior, that is where you find out."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["This version covers four spec pushes, not one."]}," The version did not move on"," ","any of them, so the release check failed each time and no SDK was"," ","built. No SDK was ever published from those four commits. Nothing is missing"," ","from your build as a result — the SDKs go straight from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.24"]}," to this"," ","version, carrying everything below."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking","__idx":11},"children":["Breaking"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method"]}," on an ACH response replaces ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["first_name"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_name"]},"."]}," The gateway made this change on 2026-09-11 and"," ","this document did not follow, so ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.24"]}," has been describing a field the API"," ","stopped sending. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BankAccountOutput"]}," sets ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["additionalProperties: false"]},", which"," ","means a client validating an ACH transaction response against ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.24"]}," has"," ","been rejecting every one of them since that date. Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_name"]}," where you"," ","read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]},"; it carries the same value the old field did."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYMENT_TOKEN"]}," is gone from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentMethodTypeOutput"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentTokenOutput"]}," is gone from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentMethodOutput"]},"."]}," Your generated enum"," ","loses a member, so code naming it stops compiling. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["That code was already dead."]}," The gateway never returned it: paying with a token resolves the token"," ","to the card or bank account behind it and reports that, so a response is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CARD"]}," ","or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACH"]}," and the token comes back in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_token"]}," on either one. Delete the"," ","branch rather than replacing it."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-2","__idx":12},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.card_type"]}," is always ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UNKNOWN"]}," on a transaction response."]}," ","Not sometimes — always. The processor does not return the card type on the"," ","authorization, so the gateway has nothing to report yet, and the determined"," ","value appears when you read the transaction back from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]}," or"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions/{id}"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionResponse"]}," now states the general rule"," ","this is an instance of: the transaction and reporting endpoints return the same"," ","object, a transaction response is the earlier of the two, and some values are"," ","not known when the gateway answers the original request. Treat ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UNKNOWN"]}," as"," ","\"not yet known\" on a transaction response and \"the processor could not"," ","determine it\" on a reporting response."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card_type"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]}," accepts a comma-separated list."]}," It"," ","always did; the document declared a single value. Send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card_type=CREDIT,DEBIT"]}," ","to match either."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card_type"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/batches/transactions"]}," is a different parameter with a narrower value set."]}," It takes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DEBIT"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CREDIT"]}," only — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UNKNOWN"]}," returns 400"," ","there — and it does not accept a list. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CREDIT"]}," on that operation also returns"," ","transactions whose card type is undetermined, because open-batch eligibility"," ","groups the two together. The same value therefore selects a wider set of rows"," ","there than on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]},". One schema was describing both operations"," ","and could not describe either correctly."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metadata"]}," states the four limits the gateway enforces."]}," At most 50 keys,"," ","keys matching ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["^[a-zA-Z0-9_-]+$"]}," up to 40 characters, values up to 500"," ","characters. All four were already enforced and the 50-key cap was not written"," ","down anywhere. They are machine-readable now, so your SDK can check them"," ","instead of your reading this paragraph."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_contact_details"]}," on a client request is no longer the same schema as on a response."]}," The request schemas are new: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ClientAdminContactDetailsInput"]}," on"," ","create, where ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["first_name"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_name"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," are required, non-nullable"," ","and must not be empty, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ClientAdminContactDetailsUpdate"]}," on update, where"," ","every property is optional. The old shared schema declared those properties"," ","required ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["and"]}," nullable at once, so sending ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"first_name\": null"]}," satisfied the"," ","document and returned 400 from the service."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added-1","__idx":13},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A partial client update is now legal in the document."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/clients/{clientId}"]}," has always accepted a body changing only what you name;"," ","the shared schema made the document demand four contact properties you had no"," ","intention of changing. Send only what you are changing. Re-sending the rest was"," ","how a value got overwritten with a stale copy."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"known-limitation","__idx":14},"children":["Known limitation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The response ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_contact_details"]}," still declares its four properties required and nullable."]}," That is deliberate and correct on a response: the keys"," ","are always present, and a client created through an internal path can genuinely"," ","carry null. Only the request side was tightened."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["format: email"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_contact_details.email"]}," does not describe what is accepted."]}," The gateway enforces a stricter rule than the format implies — it"," ","rejects plus-addressing and every top-level domain longer than four characters,"," ","so ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ops+paradise@example.com"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ops@acme.agency"]}," both return 400. That is a"," ","service defect rather than a documentation one, and it is being fixed rather"," ","than documented. Until it ships, avoid both shapes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_contact_details.phone"]}," accepts less than the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Phone"]}," schema it points at."]}," A separator directly after the country code is rejected there and accepted"," ","on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primary_phone"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["support_phone"]}," — so ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+1-800-555-1234"]},", which this"," ","document publishes as an example on that schema, returns 400 on the admin"," ","contact. Also a service defect being fixed rather than documented. Until it"," ","ships, send that field without a separator after the country code:"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+18005551234"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["website"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/clients"]}," is capped at 30 characters and this document still does not say so."]}," A correction is planned. The cap comes from the"," ","acceptor URL field the processor carries."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta24--2026-09-04","__idx":15},"children":["1.0.0-beta.24 — 2026-09-04"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Four properties that report a returned VeriCheck ACH transaction. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The service already emits them"]}," — they shipped on 2026-09-04 — so this version is the document catching up, not a new capability."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["That matters if you validate responses. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionResponse"]}," sets"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["additionalProperties: false"]},", so a client checking a live response against"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.23"]}," has been rejecting every transaction since the service shipped. This"," ","version is the fix for that."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added-2","__idx":16},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionResponse"]}," gains ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returned_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_code"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_reason"]},"."]}," An ACH transaction can be returned days after it was"," ","approved, and it can be returned after it has already settled. Nothing in the"," ","contract said so before this version."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["One schema change reaches all seven operations that return a transaction,"," ","because ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionsListResponse.transactions"]}," items point at this schema:"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/transactions"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions/{id}"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/transactions/{id}/capture"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/transactions/{id}/cancel"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/batches/transactions"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/batches/{id}/transactions"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you have to do."]}," Nothing, to keep compiling — all four are optional, the"," ","way every other property on this schema is. Two things are worth changing anyway:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]}," alongside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_settled"]},", not instead of it."]}," A transaction"," ","can be both settled and returned. A returned transaction that never settled is"," ","also possible."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Anything computing a success state from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result"]}," alone should now also check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]},"."]}," An approved transaction that was later returned is not a"," ","successful one, and before this version you had no way to tell."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"known-limitation-1","__idx":17},"children":["Known limitation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]}," is false on a card transaction, never absent."]}," Only ACH can be"," ","returned. The property is a plain ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boolean"]}," rather than nullable, so a card"," ","transaction reports ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},". Confirmed against dev on 2026-09-06 across 25"," ","card rows and 39 ACH rows — all 64 carried the property."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_code"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_reason"]}," are omitted, not null, when there is no return."]}," Neither key appeared on any of those 64 rows. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returned_at"]}," behaves"," ","differently: it is always present and null. So read all three with a"," ","key-missing check, not only a null check."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A returned transaction has not been observed on dev."]}," No row in either"," ","sample carried ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]}," true, so the shape of a populated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returned_at"]}," ","is declared here rather than measured. It is typed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["format: date-time"]},", and"," ","VeriCheck's own events feed reports timestamps as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2021-07-26 16:44:25 ET"]},","," ","which the gateway converts before returning it. If you see the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ET"]}," form reach you, that conversion is missing"," ","and the value is violating this document — report it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_code"]}," is a free-form string, not an enum."]}," The NACHA codes are not"," ","published as an enum with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["x-enumDescriptions"]}," yet. That work is planned."," ","Do not switch on the value without a default branch."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["No filter or sort by return state."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]}," gains no query"," ","parameter here, so finding returned transactions means reading the flag on each"," ","row. Whether a return should also raise a webhook is an open"," ","question."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The emitted OpenAPI document names ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]}," in its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["required"]}," list. That"," ","is an artifact of how the document is generated rather than a statement about"," ","the contract, and it is deliberately not carried into this document. Treat all"," ","four as optional, the way every other property on this schema is."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta23--2026-09-02","__idx":18},"children":["1.0.0-beta.23 — 2026-09-02"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Required fields the gateway has always enforced and the spec never named. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The API did not change."]}," Every request this version rejects was already being"," ","rejected; the document simply now says so, and your generated SDK will now say so"," ","at compile time instead of leaving you to find out at runtime."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-1","__idx":19},"children":["Breaking"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/integrations"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/integrations/{id}"]}," require 23 more fields on a TSYS ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["integration_details"]},"."]}," The list goes from six to"," ","twenty-nine: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["address1"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["agent_bank_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["agent_chain_number"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amex_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amex_opt_blue"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["association"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bin"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_city"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_postal"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_state"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["discover_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["industry"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_aba_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_settlement_agent_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mid"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mvv"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reimbursement_attribute"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sharing_group"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["store_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["terminal_id"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["terminal_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["url"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["v_number"]}," join the six already there. The gateway already rejected an empty value for every one of them, so a"," ","boarding request that omitted any of them was already returning ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The same 23 stopped accepting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},"."]}," They were typed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[string, \"null\"]"]}," ","and are now ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["string"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amex_opt_blue"]}," likewise becomes a plain ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boolean"]},"."," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".NotEmpty()"]}," rejects null as well as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"\""]},", so the nullable typing was never"," ","true."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/batches/close"]}," requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["processor"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["batch_type"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["created_at"]},"."]}," The gateway already rejected a request missing any of them. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}," ","and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["created_at"]}," also stop accepting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["batch_id"]}," is unchanged"]}," —"," ","omitting it still closes every open batch for the client, which is the normal"," ","call."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you have to do."]}," Regenerate, then expect compile errors wherever you"," ","build a TSYS integration or a batch close. Fill in the fields you were omitting."," ","If your code already sent all of them, nothing changes for you but the type"," ","signatures."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-3","__idx":20},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fourteen ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["integration_details"]}," fields now carry the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["maxLength"]}," the service"," ","enforces: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["address1"]}," 32, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_number"]}," 4, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_city"]}," 32,"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_country"]}," 3, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_postal"]}," 10, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_state"]}," 2,"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_store_number"]}," 4, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fcsid"]}," 7, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_aba_number"]}," 9,"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_settlement_agent_number"]}," 4, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}," 25, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sharing_group"]}," 30,"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["terminal_id"]}," 8, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["v_number"]}," 8. These mirror the TSYS G3v088 field widths and"," ","have always been enforced. A 40-character ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["descriptor_city"]}," was returning ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," ","against a document that declared no limit."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TsysIntegrationRequestExample"]}," gained the four required fields it never"," ","carried — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amex_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["association"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bin"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["discover_number"]}," — and its"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_number"]}," dropped from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["123456"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1234"]},", because six characters exceeded"," ","the cap the service applies. Both the request and response examples changed, so"," ","they still agree."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"known-limitation-2","__idx":21},"children":["Known limitation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The spec still does not declare ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["minLength: 1"]}," on the 52 fields where the"," ","service rejects an empty string. Almost all of them are required fields whose"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".NotEmpty()"]}," rule already says so, and restating it as a length would state the"," ","same fact twice. The three that are not required — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mcc"]}," and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}," — are required too. So no field on the integration schema earned a"," ","length floor."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta22--2026-08-30","__idx":22},"children":["1.0.0-beta.22 — 2026-08-30"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added-3","__idx":23},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card_type"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]}," accepts ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UNKNOWN"]},". The processor reports"," ","it when it cannot determine the card type, and it is the common case, so a"," ","filter of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CREDIT"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DEBIT"]}," alone returns very few rows."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-4","__idx":24},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EntryMethod"]}," said \"Currently the only option is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ECOMMERCE"]},"\" while its enum"," ","had carried ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MOTO"]}," since ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.20"]},". The description now names both values."," ","Document only — no request or response shape moved."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta21--2026-08-30","__idx":25},"children":["1.0.0-beta.21 — 2026-08-30"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-2","__idx":26},"children":["Breaking"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," filter on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]}," no longer accepts ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VOID"]},". Sending"," ","it returns a server error. A canceled payment is reported as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CANCEL"]},", so"," ","filter on that instead."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added-4","__idx":27},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," filter accepts ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYOUT"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["REFUND"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CANCEL"]},", and is now declared"," ","as an array so a comma-separated list is explicit — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type=SALE,AUTH"]},". Matching"," ","is case-insensitive."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phone"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_contact_details"]}," is optional and accepts null. It was"," ","required."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"known-limitation-3","__idx":28},"children":["Known limitation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Filtering by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYOUT"]}," is accepted and then ignored. It returns unfiltered"," ","results rather than an error."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta20--2026-08-29","__idx":29},"children":["1.0.0-beta.20 — 2026-08-29"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The reconciliation release. The spec was compared against the service's emitted"," ","Swagger, its C# source, and its validators, and corrected to describe what the"," ","API actually does. Twenty commits landed under this one version. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If you are on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.19"]}," or earlier, regenerate your SDK and read this entry in full."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-3","__idx":30},"children":["Breaking"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entry_method"]}," moved from the transaction request root into ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method"]},"."," ","Send it inside the card object."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/transactions/{id}/capture"]}," no longer takes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," in the body. The"," ","endpoint implies it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/integrations"]}," no longer takes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]},", and no longer requires it."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added-5","__idx":31},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/clients"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["api_key"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["This is the only call that ever returns it."]}," Store it as a secret; no later call reissues it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metadata"]}," on the client, integration, and TSYS host detail objects."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["correlation_id"]}," on the batch, client, and integration responses."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recurring"]}," on the transaction request and response, and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initial_network_transaction_id"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recurring_details"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settlement_issue"]}," on the transaction response."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["currency"]}," on the transaction request."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entry_method"]}," on the card payment method, with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MOTO"]}," alongside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ECOMMERCE"]},"."," ","Both are Card Not Present."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A declared ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["502"]}," response, so a processor failure is part of the contract."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Vericheck onboarding request and response schemas."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The integration summary response, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VERICHECK"]}," on the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["integration"]}," filter."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Roughly forty TSYS host detail fields on the integration request and response."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-5","__idx":32},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Processor"]}," takes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Tsys"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Vericheck"]},", in that casing. The enum previously"," ","said ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TSYS"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VERICHECK"]},", which no integration has ever returned. This field"," ","is parsed case-sensitively, so the old spelling was always rejected."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phone"]}," became ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phone_number"]}," on the client and TSYS host detail objects, and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fax"]}," became ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fax_number"]},". The service has always used the longer names."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configuration_id"]}," became ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," on the integration responses."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Several fields the API returns as null were declared non-nullable, so a"," ","strongly typed SDK threw on real responses: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["website"]}," on the create-client"," ","response, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initiator"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recurring_details"]}," on the transaction response, and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["closed_at_date_time"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settled_at_date_time"]}," on a batch."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BankAccountOutput"]}," requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]},", so the payment method discriminator"," ","compiles."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentMethodType"]}," split into ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentMethodTypeInput"]}," and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentMethodTypeOutput"]},", and transaction type split into"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionCreateType"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionResponseType"]},". A request and a response"," ","do not use the same vocabulary, and one enum could not describe both."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Several integer fields were declared as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["number"]},", which generates a floating"," ","point type in most SDKs. They are now ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["integer"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100-beta19--2026-08-24","__idx":33},"children":["1.0.0-beta.19 — 2026-08-24"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-6","__idx":34},"children":["Corrected"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Version bump only. No content changed, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta.18"]}," was never published."]}]}]},"headings":[{"value":"API changelog","id":"api-changelog","depth":1},{"value":"How versions work during beta","id":"how-versions-work-during-beta","depth":2},{"value":"What the categories mean","id":"what-the-categories-mean","depth":2},{"value":"How deprecations work","id":"how-deprecations-work","depth":2},{"value":"A note on the entries before beta.23","id":"a-note-on-the-entries-before-beta23","depth":2},{"value":"1.0.0-beta.27 — 2026-09-18","id":"100-beta27--2026-09-18","depth":2},{"value":"Corrected","id":"corrected","depth":3},{"value":"1.0.0-beta.26 — 2026-09-17","id":"100-beta26--2026-09-17","depth":2},{"value":"Added","id":"added","depth":3},{"value":"Corrected","id":"corrected-1","depth":3},{"value":"1.0.0-beta.25 — 2026-09-16","id":"100-beta25--2026-09-16","depth":2},{"value":"Breaking","id":"breaking","depth":3},{"value":"Corrected","id":"corrected-2","depth":3},{"value":"Added","id":"added-1","depth":3},{"value":"Known limitation","id":"known-limitation","depth":3},{"value":"1.0.0-beta.24 — 2026-09-04","id":"100-beta24--2026-09-04","depth":2},{"value":"Added","id":"added-2","depth":3},{"value":"Known limitation","id":"known-limitation-1","depth":3},{"value":"1.0.0-beta.23 — 2026-09-02","id":"100-beta23--2026-09-02","depth":2},{"value":"Breaking","id":"breaking-1","depth":3},{"value":"Corrected","id":"corrected-3","depth":3},{"value":"Known limitation","id":"known-limitation-2","depth":3},{"value":"1.0.0-beta.22 — 2026-08-30","id":"100-beta22--2026-08-30","depth":2},{"value":"Added","id":"added-3","depth":3},{"value":"Corrected","id":"corrected-4","depth":3},{"value":"1.0.0-beta.21 — 2026-08-30","id":"100-beta21--2026-08-30","depth":2},{"value":"Breaking","id":"breaking-2","depth":3},{"value":"Added","id":"added-4","depth":3},{"value":"Known limitation","id":"known-limitation-3","depth":3},{"value":"1.0.0-beta.20 — 2026-08-29","id":"100-beta20--2026-08-29","depth":2},{"value":"Breaking","id":"breaking-3","depth":3},{"value":"Added","id":"added-5","depth":3},{"value":"Corrected","id":"corrected-5","depth":3},{"value":"1.0.0-beta.19 — 2026-08-24","id":"100-beta19--2026-08-24","depth":2},{"value":"Corrected","id":"corrected-6","depth":3}],"frontmatter":{"title":"API changelog","shortTitle":"Changelog","intro":"What changed in the API, version by version, and what you have to do about it. Read this before you regenerate an SDK.","type":"reference","seo":{"title":""}},"lastModified":"2026-09-24T18:25:47.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/reference/changelog","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}