Changelog
Changes to the FincheckEngine API that affect your integration.
Changes to the FincheckEngine API that affect your integration, newest first.
14 October 2026
A page per intent
Each intent now has its own docs page at /docs/intents/{id}: how to select it, its fields and rules, and an example request it accepts. The page always shows the current rules and can be printed or saved as PDF. Open it from Intent Fields. Nothing changes in the API.
13 October 2026
Quote or apply now
application_methodis documented and checked. Sendget-quote(the default) orapply-nowonPOST /offer. On v2 any other value is rejected withnot_in_enum; on v1 the value is matched ignoring case and spaces, and an unknown value is treated asget-quote. See Quote or apply now.- End-to-end needs an apply-now offer.
"type": "apply-now"onPOST /acceptnow starts an end-to-end application only when the lead was offered withapplication_method: "apply-now", and, for a partner that prices live, its match includedlive_quotes. Otherwise the accept continues as a normal referral. This applies to v1 and v2. See Applying end to end. - Matches without a price. A partner with
live_scoring_api: truecan appear inmatcheswithoutlive_quotes. It is offered without a price for that applicant. Show the match as you would any other.
12 October 2026
New API origins
The v2 API uses new origins. Changing only /api/v1 to /api/v2 on the old host is not enough.
- UAT:
https://api.engine-v2.uat.fincheck.co.za/api/v2 - Production:
https://api.engine-v2.fincheck.co.za/api/v2
Use the key for the same environment as the origin. Data and credentials do not cross environments.
7 October 2026
v2 validation
These changes apply to v2 integrations only. v1 is unchanged. Rows of POST /lead/batch follow the same rules.
- One set of rules. A request is checked against the rules every lead follows plus the rules of the intent it selects.
GET /intentreturns that contract, so read an intent's required fields, limits and custom fields from there rather than hardcoding them. Every field with a problem is reported at once, with the first problem for each field. - Selecting the intent.
intentandintent_idmust name the same intent when both are sent; otherwiseintentis reported asinvalid_value("must match intent_id"). Sending neither is one problem onintent("send one of: intent, intent_id"). An unknown or inactive intent is answered on its own, before field problems. intent_unavailable. When an intent's rules are temporarily unusable,POST /lead,POST /offer,POST /lead/batchandGET /intent/{id}return503{"code": "intent_unavailable", "message": "This intent is temporarily unavailable."}. Retry later with backoff. The intent is left out of theGET /intentlist until it recovers.- Names. Letters from any alphabet, spaces, hyphens, straight or curly apostrophes and full stops, with at least one letter:
Zoë,Ané,D’Angelo,Anne-Marie,C.J.. A failing name isinvalid_formatrather thaninvalid_value. - Email. An ASCII address with a dotted domain.
user@localhostand non-ASCII addresses are rejected. - Mobile numbers. Formatted numbers such as
+27 82 123 4567are accepted and stored as0821234567. A number that is not a South African mobile isinvalid_format, whatever its length;too_shortandtoo_longare no longer returned for it. - ID numbers. A malformed ID number has one message,
must be a valid RSA ID number. partner_ids. Sendpartner_ids. The singularpartner_idis not supported and is rejected withunsupported_fieldwhen it has a value.- Blank and null. Omit optional fields when no value is available. A blank or
nullvalue counts as not sent; for a required field that isrequired. - Error messages are sentences. Every v2
messagestarts with a capital letter and ends with a full stop, for exampleLead not found.andThis intent is not accepting leads.. Codes and HTTP statuses are unchanged, so branch oncode. Errors sent before your key is identified still have onlyerrorand nocode, and v1 responses are unchanged. - Batch rows. Row errors keep the same shape (
{"row": 3, "errors": {"field": "message"}}) with the new messages. A blank cell means not sent, text in a numeric column is rejected, decimal money is rounded to whole rand, and apartner_idscell is a comma- or semicolon-separated list.
See Intent Fields, Sending a Lead and Batch Import.
6 October 2026
Field rules
These changes apply to v2 integrations only. v1 is unchanged.
- Allowed values and ranges. Request fields are checked against published rules, not just their JSON type: fixed lists such as
payment_frequency(weekly,fortnightly,monthly,other), ranges such asrepayment_period(1–120 months) andpayday(1–31), non-negative amounts,net_incomenot abovegross_income, text lengths, a South African mobile number (06x, 07x or 081–084), and an applicant aged 18–100. A value outside its rule returns422naming the field. - New
employment_type.full_time,part_time,self_employed,contract,commission,pensioner,student,homemaker,unemployedorother. Whenemployedis left out it is set fromemployment_type. - Rules per intent.
GET /intentreturns each intent'sschema, a JSON Schema with its required fields and limits, in place offields. An intent's required fields are now enforced onPOST /leadand batch rows as well asPOST /offer. - Field tables. Every guide lists its request and response fields with type and allowed values, and Intent Fields shows each intent's rules.
Error codes
These changes apply to v2 integrations only. v1 is unchanged.
codeon every error. Error bodies carry a stable stringcodenext tomessage, for example{"code": "lead_already_accepted", "message": "This lead has already been accepted."}. Branch oncode; messages may be reworded.- A code on every field problem. In
422validation responses each field inerrorslists its problems as{"code", "message"}entries, for example"gross_income": [{"code": "required", "message": "is required"}](codes such asrequired,invalid_type,not_in_enum,below_minimum). - Generated error tables. Errors lists every code with its status, message, cause and what to do.
Duplicate submissions
These changes apply to v2 integrations only. v1 is unchanged.
- Your own leads only. Sending an applicant again is checked against your own leads. You never receive another affiliate's lead
id. resulton every lead and offer response.createdfor a new lead,duplicatewhen the lead you already have is returned. OnPOST /leadthat response has statusLead already received.POST /offerreturnsresultand does not includestatus.- New lead after a send. When your earlier lead was already sent to a partner, a repeat creates a new lead that only goes to partners the applicant has not reached recently.
- Named partners. A partner in
partner_idsthat already received the applicant is reported asalready sent to this partnerinstead of being sent again. - Accepting.
POST /acceptworks only for your own leads (404otherwise) and returns422lead_already_acceptedfor a lead already sent. - Batch. Rows follow the same rules, including against your earlier uploads. A
partner_idcolumn is rejected; usepartner_ids.
2 October 2026
Decimal amounts and placeholder values
- Money fields (
gross_income,net_income,loan_amount_required,expenses) accept any JSON number; decimals are rounded to whole rand. Numeric strings are still rejected. - Placeholders. On optional fields,
"",null,unknown,n/a,not specified, andundefined(any letter case) mean not provided. See Placeholder values.
30 September 2026
v2 responses and requests tightened
These changes apply to v2 integrations only. v1 is unchanged.
- Offers. Matches no longer include
company_logo_path,live_score, oruserable.partner_typeandprobability_conditionsare at the top level of each match, andlive_quotescarries the partner's quote. - Typed requests.
POST /leadandPOST /offermust be sent asapplication/json(otherwise415), with each field in its JSON type. Numeric strings such as"25000"and words such as"yes"are rejected with422naming the field. - Removed request fields. The singular
partner_idonPOST /leadandPOST /offer, andlive_scoreonPOST /accept, are rejected with422. Usepartner_idsandlive_quotes. - Response bodies.
codeis no longer returned; read the HTTP status. Errors usemessagethroughout, and validation errors sayValidation failed. - Lead lookups.
GET /lead/{hashid}andGET /accept/{hashid}/linkreturn only your own leads. Any other id returns404.
See Upgrade to v2 for before-and-after examples.
29 September 2026
API v1 deprecated
API v1 is closed to new integrations and will be retired. No retirement date has been set yet; it will be announced here with advance notice.
- v1 credentials do not work on v2. Request v2 keys from support@finch-technologies.com.
- Existing v1 integrations should upgrade to v2 now.