> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://infonite.dev/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://infonite.dev/_mcp/server.

# Read the state

GET https://clients.infonite.tech/api/executions/handler/v1/{execution_id}

Where an execution is, how long it has taken, what each feature did, and what it is waiting for.

This is the detailed view. For a loop, use [Poll the state](api:HEAD/executions/handler/v1/\{execution_id}) — it answers with a status code and no body — and come here when it tells you something changed.

**Read `is_closed` first.** While it is `false` the execution is alive and the records can still change. When it is `true` the run is over and `status_reason` says how it went — `COMPLETED`, `PARTIAL`, or the reason it could not.

## What the code tells you

| Code  | What the body is                                                                                                                                                                                        |
| :---- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `200` | A state you can act on: the execution is closed, **or** it was rejected over its parameters or configurations and the body names the offending fields.                                                  |
| `202` | Still working. Everything known so far is already there — the features retrieved, the time spent, how the login went.                                                                                   |
| `423` | An **Action Required State**: `form_schema` is the form to render and `action_required_expires` your deadline. The answer goes to [Resume an Execution](api:PUT/executions/handler/v1/\{execution_id}). |
| `404` | No execution with that id for your application, or it has been deleted.                                                                                                                                 |

## What to read in the body

| Field                                          | Why you would read it                                                                                                                                                                   |
| :--------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `status_code` · `status_reason`                | The family and the precise cause. Branch on these, never on `status_message`, which is prose and may change.                                                                            |
| `authentication_status`                        | How the **login** went, separately from the extraction — `not-performed` until the engine has tried. It is what tells *we could not get in* from *we got in and the data did not come*. |
| `features`                                     | One entry per feature you asked for, with its own outcome. This is how a `PARTIAL` execution tells you what arrived and what did not.                                                   |
| `products_count`                               | How much was retrieved, by kind — a cheap way to see whether there is anything worth fetching.                                                                                          |
| `messages` · `warnings_count` · `errors_count` | Notes the engine recorded on the way. Read them when a run ended in a way you did not expect.                                                                                           |
| `locking_hash`                                 | A stable fingerprint of the fixed part of the credentials, so you can recognise a returning login without storing any of it.                                                            |

**Three times, and the gap between them is the answer.** `execution_time` is active processing, `running_time` adds whatever was spent waiting for a person, and `total_elapsed_time` counts from the moment you asked — queue included. All three are in **seconds**. When a run feels slow, the difference says whether it was us, the source, or your customer.

**Server to server only.** This call is authorised with your application secret: it belongs in your backend, never in a browser, a mobile app or anything your customer can read.

Reference: https://infonite.dev/api-reference/direct-executions/direct-executions-api/handling-the-state/direct-executions-v-1-handler-state

## Authentication

- `X-APP-SECRET` header (required) — Application Secret

## Servers

- `https://clients.infonite.tech/api` (Legacy Server, default)
- `https://clients.infonite.io/api` (Production Server)

## Request

### Path parameters

- `execution_id` (string, required) — The execution, as the acceptance response returned it.

## Response

### 200

**200 OK****A state you can act on.** Either the execution is closed — `is_closed` is `true` and `status_reason` says how it went — or it was rejected over its parameters or configurations, and the body names the offending fields. `features` is what turns a `PARTIAL` into something actionable: one entry per feature you asked for, each with its own outcome.

- `execution_id` (string, required) — The execution this belongs to — the value you poll for the state and address every results endpoint with. Always present here: an event exists because an execution does.
- `session_id` (string, required) — The session this execution belongs to. An execution launched on its own is its own session, so the two values usually match — treat them as independent anyway: an execution can be one step of a wider journey. Address everything by `execution_id`.
- `app_id` (string, required) — The application this execution was launched with — the one your secret belongs to. Worth keeping when your product uses more than one, a sandbox and a production app being the usual case: every record and every event we send carries it.
- `customer_id` (string, required) — The `customer_id` you supplied when the execution was initialised, returned as you sent it — so an answer can be routed to the right case with no lookup on your side.
- `engine_reference` (string, required) — The engine this execution runs, exactly as the catalogue publishes it. It is echoed on every event and every record, so a stored result says which source it came from with no lookup on your side.
- `auth_origin` (enum, required) — How the call that created the execution was authorised: an application secret for a server-to-server call, or a user session when it was launched from a console. An audit field — it says who started the run, not how it went.
  - Allowed values: `app-secret`, `user-token`, `session-token`
- `status_reason` (enum or enum or enum or enum or enum or enum or enum or enum or enum or enum, required) — The precise cause of the state. Every reason belongs to exactly one `status_code` family and its wording never changes, so it is safe to branch on — read `status_code` when the family is all you need, and see [the lifecycle](/direct-executions/lifecycle#every-reason-by-family) for what each one asks of you. * Reasons for `ONGOING`: * `ACCEPTED`: queued, nothing has started yet. * `WAITING`: picked up, the engine is warming up. * `RUNNING`: logged in and extracting. * `ASYNC_WAIT`: waiting on the source to produce something on its own schedule. * Reasons for `ACTION_REQUIRED`: * `MFA_REQUIRED`: the source asked for a strong-authentication factor. * `INPUT_REQUIRED`: the engine needs another field it could not know in advance. * Reasons for `COMPLETED`: * `COMPLETED`: every requested feature answered. * Reasons for `PARTIAL`: * `PARTIAL`: finished, with some features answered and others not. * Reasons for `FAILED`: * `FAILED`: finished, and nothing could be retrieved. * Reasons for `ABORTED`: * `CLIENT_CANCELLED`: you aborted it. * `USER_CANCELLED`: your customer abandoned it. * `ACTION_TIMEOUT`: nobody answered the challenge in time. * `TIMEOUT`: the run exceeded its `execution_timeout`. * `CUSTOMER_INTERVENTION_REQUIRED`: a person was needed and none was available. * `SYSTEM_CANCELLED`: the platform stopped it. * Reasons for `AUTH_ERROR` — the source refused the login, and retrying the same values will not help: * `INCORRECT_CREDENTIALS`: rejected. Ask your customer for them again. * `INCORRECT_MFA`: the challenge was answered wrongly. * `BLOCKED_USER`: the institution has blocked the access. * `FRIEZED_CREDENTIALS`: the access is temporarily frozen. * `CHANGE_PASSWORD`: the institution requires a password change first. * `MANUAL_INTERVENTION`: the person must do something in the source's own channel. * `INCOMPATIBLE_ACCESS`: this access does not work through this engine's channel. * `DUPLICATED_SESSION`: another session is already open for that user. * Reasons for `UNHANDLED_AUTH_ERROR`: * `UNHANDLED_AUTH_ERROR`: the login failed in a way we could not classify. * Reasons for `CONFIGURATION_ERROR` — the request itself, so retrying it unchanged fails the same way: * `BAD_CONFIGURATIONS`: a feature configuration the engine does not accept. * `INCORRECT_PARAMETERS_FORMAT`: the parameters did not match the engine's form. * `INCORRECT_RESUME_FORMAT`: the resume body did not match the published form. * `ENCRYPTION_ERROR`: an encrypted value could not be opened. * `T10N_FORBIDDEN`: your application may not tokenize. * `T10N_NOT_AVAILABLE`: this engine does not support tokenization. * `T10N_REJECTED`: the token is revoked or broken. * `T10N_EXCEPTION`: the stored credentials could not be read. * `BAD_PROXY_CONFIGURATION`: ours, not yours — contact support. * Reasons for `TEMPORARY_ERROR` — nothing is wrong with your request, retry later: * `OUT_OF_SERVICE`: the source itself is unavailable. * `ENGINE_UNAVAILABLE`: the engine is not serving right now. * `ALREADY_EXECUTING`: another execution is already running for that access. * `ENGINE_BANNED`, `AUTO_CAPTCHA_ERROR`, `PROXY_ERROR`, `NETWORK_ERROR`, `INTERNAL_ERROR`: the run could not be set up. Ours, and transient. `AUTH_OK` belongs to this vocabulary too, but it only ever appears in `authentication_status`: a login that succeeds leaves the execution `ONGOING`.
- `products_count` (map from string to integer, required) — How many records of each kind were retrieved — a quick way to see whether an execution brought anything back before you read it. The key is `<family>:<subtype>@<product>`, so `financial_card:credit@financial_card` counts the credit cards and `financial_card:debit@financial_card` the debit ones.
- `end_hook` (enum, required) — Whether the `ended` webhook reached your endpoint. `skipped` means no rule was bound to it; anything else says how the delivery went, and a failed one is retried in the background.
  - Allowed values: `skipped`, `pending`, `delivered`, `re_delivered`, `doubtful`, `failed`, `ko`
- `status_code` (enum, required) — The family a state belongs to, and the value to branch on: it is always present, and every `status_reason` belongs to exactly one of these. The precise cause lives in the reason — read it when the family is not specific enough to decide. Allowed values are: - `ONGOING`: The execution is ongoing - `ACTION_REQUIRED`: The execution is waiting for an input - `COMPLETED`: The execution has been completed - `ABORTED`: The execution has been aborted - `CONFIGURATION_ERROR`: The execution has been rejected due to a configuration error - `PARTIAL`: The execution has been completed with errors - `TEMPORARY_ERROR`: The execution cannot be processed due to a temporary error - `AUTH_ERROR`: The execution failed due to an authentication error - `UNHANDLED_AUTH_ERROR`: The execution failed during the login because of an unhandled error - `FAILED`: The execution has failed
  - Allowed values: `ONGOING`, `ACTION_REQUIRED`, `COMPLETED`, `ABORTED`, `CONFIGURATION_ERROR`, `PARTIAL`, `TEMPORARY_ERROR`, `AUTH_ERROR`, `UNHANDLED_AUTH_ERROR`, `FAILED`
- `is_closed` (boolean, required) — Whether the execution is over. While it is `false` the state and the records can still change.
- `warnings_count` (integer, required) — How many of `messages` are warnings: the execution carried on.
- `errors_count` (integer, required) — How many of `messages` are errors. A `PARTIAL` or `FAILED` run explains itself here.
- `external_execution_id` (string, optional, nullable)
- `locking_hash` (string, optional, nullable)
- `status_message` (string, optional, nullable)
- `authentication_status` ("not-performed" or enum or enum, optional) — How the login went, on its own — separate from how the extraction went. `not-performed` until the engine has tried, `AUTH_OK` once the source accepted the credentials, and otherwise the reason it refused them. It is the field that tells *we could not get in* from *we got in and the data did not come*, which are different conversations with your customer.
- `date_created` (string, optional) — When we accepted the request. The clock your customer perceives starts here.
- `date_started` (string, optional) — When the engine picked it up and began working. Everything before this was queue.
- `date_ended` (string, optional) — When the execution reached its final state, whatever that state is. Absent while it runs.
- `running_time` (double, optional) — Elapsed since work began — active processing AND any time spent waiting for a person.
- `total_elapsed_time` (double, optional) — Elapsed since you asked: queue, processing and waiting. The number your customer feels.
- `execution_time` (double, optional) — Active processing only. Compare it with `total_elapsed_time` when a run feels slow: the gap is queue and waiting, not work.
- `action_required_expires` (string, optional) — The deadline for answering a pending challenge. Past it the execution is aborted with `ACTION_TIMEOUT` and has to be started again.
- `next_kick_date` (string, optional) — When the platform will pick this execution up again on its own. It appears while a source is taking its own time (`ASYNC_WAIT`): nothing to do but wait for the next event.
- `features` (list of object, optional) — One entry per feature you asked for, with its own outcome — which is how a `PARTIAL` execution tells you what arrived and what did not.
  - `code` (enum, required) — The feature, as you asked for it.
    - Allowed values: `accounts_read`, `cards_read`, `deposits_read`, `loans_read`, `credits_read`, `investment_accounts_read`, `funds_read`, `stocks_read`, `pensions_read`, `accounts_certificates`, `direct_debits_read`, `customer_information_read`, `source_contracts_read`, `cloud_resource_read`, `supplier_invoices_read`, `client_invoices_read`, `labor_check`, `public_pensions`, `public_document_verification`, `yearly_individual_tax`, `vehicles_data`, `driver_data`, `academic_data`, `properties_data`, `credit_registry_data`
  - `status_reason` (enum, required) — How this one ended, on its own: `FEATURE_COMPLETED`, `FEATURE_PARTIAL` when some of it was read and some was not, `FEATURE_ABORTED` when the run stopped before it, or the reason it could not be read. The execution's own `status_reason` is the summary of all of them.
    - Allowed values: `FEATURE_ACCEPTED`, `FEATURE_WAITING`, `FEATURE_RUNNING`, `FEATURE_ASYNC_WAIT`, `FEATURE_ACTION_REQUIRED`, `FEATURE_ACTION_REJECTED`, `FEATURE_INCORRECT_PARAMETERS_FORMAT`, `FEATURE_ABORTED`, `FEATURE_TIMEOUT`, `FEATURE_ACTION_TIMEOUT`, `FEATURE_CUSTOMER_INTERVENTION_REQUIRED`, `FEATURE_CONFIGURATION_ERROR`, `FEATURE_COMPLETED`, `FEATURE_PARTIAL`, `FEATURE_FAILED`, `FEATURE_DISABLED`, `FEATURE_NOT_IMPLEMENTED`, `FEATURE_TEMPORARY_ERROR`, `FEATURE_INTERNAL_ERROR`
  - `status_message` (string, optional, nullable) — A human-readable note about this feature, when there is one. Never a contract: do not parse it.
- `configurations_errors` (list of object, optional) — What the engine refused in `configurations`, field by field. A `CONFIGURATION_ERROR` says to look here.
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)
- `parameters_errors` (list of object, optional) — What the engine refused in `parameters`, field by field — a wrong shape, a missing value, a date outside what this source keeps.
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)
- `messages` (list of object, optional, default: []) — Notes the engine recorded on the way — information, warnings and errors — each with `loc`, the feature that raised it. The `id` and the wording are the engine's own: read them when a run ended in a way you did not expect, and log them rather than branching on them.
  - `date` (string, required) — When the message was raised.
  - `type` (enum, required) — Severity and audience: `error`, `warning`, `info`, or `notification` (a message meant to be shown to the end user).
    - Allowed values: `error`, `info`, `warning`, `notification`
  - `id` (string, optional) — Stable identifier of the situation. The same situation always raises the same `id`, so automate on this — never on the message text, which can be reworded at any time.
  - `loc` (list of integer or string, optional, default: []) — Path of the field or item inside the result this message refers to (e.g. `["attachment"]`). Empty when it applies to the result as a whole.
  - `message` (string, optional) — Human-readable text. Written in the language of the source's market, and subject to rewording — automate on `id` instead.

### 202

**202 Accepted**Still working, with everything known so far: the features already retrieved, the time spent, and how the login went. Come back later, or let a [webhook](/direct-executions/webhooks) tell you instead of a loop.

- `execution_id` (string, required) — The execution this belongs to — the value you poll for the state and address every results endpoint with. Always present here: an event exists because an execution does.
- `session_id` (string, required) — The session this execution belongs to. An execution launched on its own is its own session, so the two values usually match — treat them as independent anyway: an execution can be one step of a wider journey. Address everything by `execution_id`.
- `app_id` (string, required) — The application this execution was launched with — the one your secret belongs to. Worth keeping when your product uses more than one, a sandbox and a production app being the usual case: every record and every event we send carries it.
- `customer_id` (string, required) — The `customer_id` you supplied when the execution was initialised, returned as you sent it — so an answer can be routed to the right case with no lookup on your side.
- `engine_reference` (string, required) — The engine this execution runs, exactly as the catalogue publishes it. It is echoed on every event and every record, so a stored result says which source it came from with no lookup on your side.
- `auth_origin` (enum, required) — How the call that created the execution was authorised: an application secret for a server-to-server call, or a user session when it was launched from a console. An audit field — it says who started the run, not how it went.
  - Allowed values: `app-secret`, `user-token`, `session-token`
- `status_reason` (enum or enum or enum or enum or enum or enum or enum or enum or enum or enum, required) — The precise cause of the state. Every reason belongs to exactly one `status_code` family and its wording never changes, so it is safe to branch on — read `status_code` when the family is all you need, and see [the lifecycle](/direct-executions/lifecycle#every-reason-by-family) for what each one asks of you. * Reasons for `ONGOING`: * `ACCEPTED`: queued, nothing has started yet. * `WAITING`: picked up, the engine is warming up. * `RUNNING`: logged in and extracting. * `ASYNC_WAIT`: waiting on the source to produce something on its own schedule. * Reasons for `ACTION_REQUIRED`: * `MFA_REQUIRED`: the source asked for a strong-authentication factor. * `INPUT_REQUIRED`: the engine needs another field it could not know in advance. * Reasons for `COMPLETED`: * `COMPLETED`: every requested feature answered. * Reasons for `PARTIAL`: * `PARTIAL`: finished, with some features answered and others not. * Reasons for `FAILED`: * `FAILED`: finished, and nothing could be retrieved. * Reasons for `ABORTED`: * `CLIENT_CANCELLED`: you aborted it. * `USER_CANCELLED`: your customer abandoned it. * `ACTION_TIMEOUT`: nobody answered the challenge in time. * `TIMEOUT`: the run exceeded its `execution_timeout`. * `CUSTOMER_INTERVENTION_REQUIRED`: a person was needed and none was available. * `SYSTEM_CANCELLED`: the platform stopped it. * Reasons for `AUTH_ERROR` — the source refused the login, and retrying the same values will not help: * `INCORRECT_CREDENTIALS`: rejected. Ask your customer for them again. * `INCORRECT_MFA`: the challenge was answered wrongly. * `BLOCKED_USER`: the institution has blocked the access. * `FRIEZED_CREDENTIALS`: the access is temporarily frozen. * `CHANGE_PASSWORD`: the institution requires a password change first. * `MANUAL_INTERVENTION`: the person must do something in the source's own channel. * `INCOMPATIBLE_ACCESS`: this access does not work through this engine's channel. * `DUPLICATED_SESSION`: another session is already open for that user. * Reasons for `UNHANDLED_AUTH_ERROR`: * `UNHANDLED_AUTH_ERROR`: the login failed in a way we could not classify. * Reasons for `CONFIGURATION_ERROR` — the request itself, so retrying it unchanged fails the same way: * `BAD_CONFIGURATIONS`: a feature configuration the engine does not accept. * `INCORRECT_PARAMETERS_FORMAT`: the parameters did not match the engine's form. * `INCORRECT_RESUME_FORMAT`: the resume body did not match the published form. * `ENCRYPTION_ERROR`: an encrypted value could not be opened. * `T10N_FORBIDDEN`: your application may not tokenize. * `T10N_NOT_AVAILABLE`: this engine does not support tokenization. * `T10N_REJECTED`: the token is revoked or broken. * `T10N_EXCEPTION`: the stored credentials could not be read. * `BAD_PROXY_CONFIGURATION`: ours, not yours — contact support. * Reasons for `TEMPORARY_ERROR` — nothing is wrong with your request, retry later: * `OUT_OF_SERVICE`: the source itself is unavailable. * `ENGINE_UNAVAILABLE`: the engine is not serving right now. * `ALREADY_EXECUTING`: another execution is already running for that access. * `ENGINE_BANNED`, `AUTO_CAPTCHA_ERROR`, `PROXY_ERROR`, `NETWORK_ERROR`, `INTERNAL_ERROR`: the run could not be set up. Ours, and transient. `AUTH_OK` belongs to this vocabulary too, but it only ever appears in `authentication_status`: a login that succeeds leaves the execution `ONGOING`.
- `products_count` (map from string to integer, required) — How many records of each kind were retrieved — a quick way to see whether an execution brought anything back before you read it. The key is `<family>:<subtype>@<product>`, so `financial_card:credit@financial_card` counts the credit cards and `financial_card:debit@financial_card` the debit ones.
- `end_hook` (enum, required) — Whether the `ended` webhook reached your endpoint. `skipped` means no rule was bound to it; anything else says how the delivery went, and a failed one is retried in the background.
  - Allowed values: `skipped`, `pending`, `delivered`, `re_delivered`, `doubtful`, `failed`, `ko`
- `status_code` (enum, required) — The family a state belongs to, and the value to branch on: it is always present, and every `status_reason` belongs to exactly one of these. The precise cause lives in the reason — read it when the family is not specific enough to decide. Allowed values are: - `ONGOING`: The execution is ongoing - `ACTION_REQUIRED`: The execution is waiting for an input - `COMPLETED`: The execution has been completed - `ABORTED`: The execution has been aborted - `CONFIGURATION_ERROR`: The execution has been rejected due to a configuration error - `PARTIAL`: The execution has been completed with errors - `TEMPORARY_ERROR`: The execution cannot be processed due to a temporary error - `AUTH_ERROR`: The execution failed due to an authentication error - `UNHANDLED_AUTH_ERROR`: The execution failed during the login because of an unhandled error - `FAILED`: The execution has failed
  - Allowed values: `ONGOING`, `ACTION_REQUIRED`, `COMPLETED`, `ABORTED`, `CONFIGURATION_ERROR`, `PARTIAL`, `TEMPORARY_ERROR`, `AUTH_ERROR`, `UNHANDLED_AUTH_ERROR`, `FAILED`
- `is_closed` (boolean, required) — Whether the execution is over. While it is `false` the state and the records can still change.
- `warnings_count` (integer, required) — How many of `messages` are warnings: the execution carried on.
- `errors_count` (integer, required) — How many of `messages` are errors. A `PARTIAL` or `FAILED` run explains itself here.
- `external_execution_id` (string, optional, nullable)
- `locking_hash` (string, optional, nullable)
- `status_message` (string, optional, nullable)
- `authentication_status` ("not-performed" or enum or enum, optional) — How the login went, on its own — separate from how the extraction went. `not-performed` until the engine has tried, `AUTH_OK` once the source accepted the credentials, and otherwise the reason it refused them. It is the field that tells *we could not get in* from *we got in and the data did not come*, which are different conversations with your customer.
- `date_created` (string, optional) — When we accepted the request. The clock your customer perceives starts here.
- `date_started` (string, optional) — When the engine picked it up and began working. Everything before this was queue.
- `date_ended` (string, optional) — When the execution reached its final state, whatever that state is. Absent while it runs.
- `running_time` (double, optional) — Elapsed since work began — active processing AND any time spent waiting for a person.
- `total_elapsed_time` (double, optional) — Elapsed since you asked: queue, processing and waiting. The number your customer feels.
- `execution_time` (double, optional) — Active processing only. Compare it with `total_elapsed_time` when a run feels slow: the gap is queue and waiting, not work.
- `action_required_expires` (string, optional) — The deadline for answering a pending challenge. Past it the execution is aborted with `ACTION_TIMEOUT` and has to be started again.
- `next_kick_date` (string, optional) — When the platform will pick this execution up again on its own. It appears while a source is taking its own time (`ASYNC_WAIT`): nothing to do but wait for the next event.
- `features` (list of object, optional) — One entry per feature you asked for, with its own outcome — which is how a `PARTIAL` execution tells you what arrived and what did not.
  - `code` (enum, required) — The feature, as you asked for it.
    - Allowed values: `accounts_read`, `cards_read`, `deposits_read`, `loans_read`, `credits_read`, `investment_accounts_read`, `funds_read`, `stocks_read`, `pensions_read`, `accounts_certificates`, `direct_debits_read`, `customer_information_read`, `source_contracts_read`, `cloud_resource_read`, `supplier_invoices_read`, `client_invoices_read`, `labor_check`, `public_pensions`, `public_document_verification`, `yearly_individual_tax`, `vehicles_data`, `driver_data`, `academic_data`, `properties_data`, `credit_registry_data`
  - `status_reason` (enum, required) — How this one ended, on its own: `FEATURE_COMPLETED`, `FEATURE_PARTIAL` when some of it was read and some was not, `FEATURE_ABORTED` when the run stopped before it, or the reason it could not be read. The execution's own `status_reason` is the summary of all of them.
    - Allowed values: `FEATURE_ACCEPTED`, `FEATURE_WAITING`, `FEATURE_RUNNING`, `FEATURE_ASYNC_WAIT`, `FEATURE_ACTION_REQUIRED`, `FEATURE_ACTION_REJECTED`, `FEATURE_INCORRECT_PARAMETERS_FORMAT`, `FEATURE_ABORTED`, `FEATURE_TIMEOUT`, `FEATURE_ACTION_TIMEOUT`, `FEATURE_CUSTOMER_INTERVENTION_REQUIRED`, `FEATURE_CONFIGURATION_ERROR`, `FEATURE_COMPLETED`, `FEATURE_PARTIAL`, `FEATURE_FAILED`, `FEATURE_DISABLED`, `FEATURE_NOT_IMPLEMENTED`, `FEATURE_TEMPORARY_ERROR`, `FEATURE_INTERNAL_ERROR`
  - `status_message` (string, optional, nullable) — A human-readable note about this feature, when there is one. Never a contract: do not parse it.
- `configurations_errors` (list of object, optional) — What the engine refused in `configurations`, field by field. A `CONFIGURATION_ERROR` says to look here.
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)
- `parameters_errors` (list of object, optional) — What the engine refused in `parameters`, field by field — a wrong shape, a missing value, a date outside what this source keeps.
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)
- `messages` (list of object, optional, default: []) — Notes the engine recorded on the way — information, warnings and errors — each with `loc`, the feature that raised it. The `id` and the wording are the engine's own: read them when a run ended in a way you did not expect, and log them rather than branching on them.
  - `date` (string, required) — When the message was raised.
  - `type` (enum, required) — Severity and audience: `error`, `warning`, `info`, or `notification` (a message meant to be shown to the end user).
    - Allowed values: `error`, `info`, `warning`, `notification`
  - `id` (string, optional) — Stable identifier of the situation. The same situation always raises the same `id`, so automate on this — never on the message text, which can be reworded at any time.
  - `loc` (list of integer or string, optional, default: []) — Path of the field or item inside the result this message refers to (e.g. `["attachment"]`). Empty when it applies to the result as a whole.
  - `message` (string, optional) — Human-readable text. Written in the language of the source's market, and subject to rewording — automate on `id` instead.

## Errors

### 404 Not Found Error

**404 Not Found**No execution with that id for your application, or it has been deleted. A deleted execution answers exactly like one that never existed.

- `detail` (string, required) — Error message

### 422 Unprocessable Entity Error

Validation Error

- `detail` (list of object, optional)
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)

### 423 Locked Error

**423 Locked**Paused, waiting for an answer. The body is an **Action Required State**: `form_schema` describes the fields to collect, `producer` says who is asking — the login, or one feature — and `action_required_expires` is the deadline. Send the values to [Resume an Execution](api:PUT/executions/handler/v1/\{execution_id}).

- `execution_id` (string, required) — The execution this belongs to — the value you poll for the state and address every results endpoint with. Always present here: an event exists because an execution does.
- `session_id` (string, required) — The session this execution belongs to. An execution launched on its own is its own session, so the two values usually match — treat them as independent anyway: an execution can be one step of a wider journey. Address everything by `execution_id`.
- `app_id` (string, required) — The application this execution was launched with — the one your secret belongs to. Worth keeping when your product uses more than one, a sandbox and a production app being the usual case: every record and every event we send carries it.
- `customer_id` (string, required) — The `customer_id` you supplied when the execution was initialised, returned as you sent it — so an answer can be routed to the right case with no lookup on your side.
- `engine_reference` (string, required) — The engine this execution runs, exactly as the catalogue publishes it. It is echoed on every event and every record, so a stored result says which source it came from with no lookup on your side.
- `auth_origin` (enum, required) — How the call that created the execution was authorised: an application secret for a server-to-server call, or a user session when it was launched from a console. An audit field — it says who started the run, not how it went.
  - Allowed values: `app-secret`, `user-token`, `session-token`
- `status_reason` (enum, required) — Which kind of answer is wanted: `MFA_REQUIRED` for a strong-authentication challenge, `INPUT_REQUIRED` for anything else the engine could not know in advance.
  - Allowed values: `MFA_REQUIRED`, `INPUT_REQUIRED`
- `producer` ("engine" or enum, required) — Who raised it: `engine` for the execution itself — the login, typically — or the feature's own code when a single feature is what needs something. An `action_required` from the accounts reader says `accounts_read`, so you know what is being asked for before reading the form.
- `status_code` ("ACTION_REQUIRED", required) — Always `ACTION_REQUIRED` here: the execution is waiting for an answer.
- `is_closed` (boolean, required) — Whether the execution is over. While it is `false` the state and the records can still change.
- `external_execution_id` (string, optional, nullable)
- `locking_hash` (string, optional, nullable)
- `status_message` (string, optional, nullable)
- `authentication_status` ("not-performed" or enum or enum, optional) — How the login went, on its own — separate from how the extraction went. `not-performed` until the engine has tried, `AUTH_OK` once the source accepted the credentials, and otherwise the reason it refused them. It is the field that tells *we could not get in* from *we got in and the data did not come*, which are different conversations with your customer.
- `date_created` (string, optional) — When we accepted the request. The clock your customer perceives starts here.
- `date_started` (string, optional) — When the engine picked it up and began working. Everything before this was queue.
- `date_ended` (string, optional) — When the execution reached its final state, whatever that state is. Absent while it runs.
- `running_time` (double, optional) — Elapsed since work began — active processing AND any time spent waiting for a person.
- `total_elapsed_time` (double, optional) — Elapsed since you asked: queue, processing and waiting. The number your customer feels.
- `execution_time` (double, optional) — Active processing only. Compare it with `total_elapsed_time` when a run feels slow: the gap is queue and waiting, not work.
- `action_required_expires` (string, optional) — The deadline for answering a pending challenge. Past it the execution is aborted with `ACTION_TIMEOUT` and has to be started again.
- `next_kick_date` (string, optional) — When the platform will pick this execution up again on its own. It appears while a source is taking its own time (`ASYNC_WAIT`): nothing to do but wait for the next event.
- `form_schema` (object or object, optional) — The fields to collect, as an OpenAPI 3.0.3 Schema Object — so a renderer that speaks JSON Schema already understands it. What is ours lives under `x-meta`.
  - MFA Required Form
    - `properties` (map from string to any, required) — Properties of the form
    - `type` ("object", required) — Type of the form
    - `format` ("cg-action-required", required) — Type of form
    - `$defs` (map from string to any, optional, nullable) — Definitions
    - `required` (list of string, optional, nullable) — List of required fields
    - `x-meta` (object, optional, nullable) — Meta information of the form
      - `reason` ("MFA_REQUIRED", required)
      - `timeout` (integer, required) — Timeout in seconds
      - `mfa_type` (enum, required) — Type of MFA
        - Allowed values: `otp-sms`, `otp-email`, `push-notification`, `totp`, `generic`
      - `instructions_title` (string, optional, nullable) — Title of the form
      - `instructions_text` (string, optional, nullable) — Title of the form
      - `submit_button_text` (string, optional, nullable) — Title of the form
  - Input Required Form
    - `properties` (map from string to any, required) — Properties of the form
    - `type` ("object", required) — Type of the form
    - `format` ("cg-action-required", required) — Type of form
    - `$defs` (map from string to any, optional, nullable) — Definitions
    - `required` (list of string, optional, nullable) — List of required fields
    - `x-meta` (object, optional, nullable) — Meta information of the form
      - `reason` ("INPUT_REQUIRED", required)
      - `timeout` (integer, required) — Timeout in seconds
      - `instructions_title` (string, optional, nullable) — Title of the form
      - `instructions_text` (string, optional, nullable) — Title of the form
      - `submit_button_text` (string, optional, nullable) — Title of the form
- `payload_errors` (list of object, optional) — What was wrong with the last answer you sent, field by field. Present only after a rejected attempt: collect the values again and resume.
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)

## Examples

### Finished in five seconds, everything answered

**Response**

```json
{
  "execution_id": "6aa3d8b418d1c5dc9a8e3d36",
  "session_id": "5aa3dca503e37e6809539a58",
  "app_id": "4aa3dcbab3287e2385bb5cec",
  "customer_id": "my-customer-1",
  "engine_reference": "DEMOBANKXXXXFIN100ES9999-mobile",
  "auth_origin": "app-secret",
  "status_reason": "COMPLETED",
  "products_count": {
    "customer_information:user_profile@customer_information": 1,
    "financial_account:current@financial_account": 3,
    "financial_card:credit@financial_card": 3,
    "financial_card:debit@financial_card": 3,
    "financial_loan:mortgage@financial_loan": 1,
    "financial_loan:personal@financial_loan": 1
  },
  "end_hook": "delivered",
  "status_code": "COMPLETED",
  "is_closed": true,
  "warnings_count": 0,
  "errors_count": 0,
  "external_execution_id": "case-A-1029",
  "locking_hash": "v1.36GHPwfDK-UUZGG4fb1jtg",
  "authentication_status": "AUTH_OK",
  "date_created": "2026-09-12T10:15:53+00:00",
  "date_started": "2026-09-12T10:15:53+00:00",
  "date_ended": "2026-09-12T10:15:59+00:00",
  "running_time": 5.347,
  "total_elapsed_time": 5.617,
  "execution_time": 5.342688,
  "features": [
    {
      "code": "customer_information_read",
      "status_reason": "FEATURE_COMPLETED"
    },
    {
      "code": "accounts_read",
      "status_reason": "FEATURE_COMPLETED"
    },
    {
      "code": "cards_read",
      "status_reason": "FEATURE_COMPLETED"
    },
    {
      "code": "loans_read",
      "status_reason": "FEATURE_COMPLETED"
    }
  ]
}
```

**SDK Code**

```python Finished in five seconds, everything answered
import requests

url = "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Finished in five seconds, everything answered
const url = 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Finished in five seconds, everything answered
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Finished in five seconds, everything answered
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java Finished in five seconds, everything answered
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php Finished in five seconds, everything answered
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Finished in five seconds, everything answered
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Finished in five seconds, everything answered
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Finished, with a gap in one feature

**Response**

```json
{
  "execution_id": "6aa3d8b418d1c5dc9a8e3d36",
  "session_id": "5aa3dca503e37e6809539a58",
  "app_id": "4aa3dcbab3287e2385bb5cec",
  "customer_id": "my-customer-1",
  "engine_reference": "DEMOBANKXXXXFIN100ES9999-mobile",
  "auth_origin": "app-secret",
  "status_reason": "PARTIAL",
  "products_count": {
    "customer_information:user_profile@customer_information": 1,
    "financial_account:current@financial_account": 3,
    "financial_card:credit@financial_card": 3,
    "financial_card:debit@financial_card": 3,
    "financial_loan:personal@financial_loan": 1
  },
  "end_hook": "delivered",
  "status_code": "PARTIAL",
  "is_closed": true,
  "warnings_count": 1,
  "errors_count": 0,
  "external_execution_id": "case-A-1029",
  "locking_hash": "v1.36GHPwfDK-UUZGG4fb1jtg",
  "status_message": "Some data could not be retrieved.",
  "authentication_status": "AUTH_OK",
  "date_created": "2026-09-12T10:15:53+00:00",
  "date_started": "2026-09-12T10:15:53+00:00",
  "date_ended": "2026-09-12T10:16:01+00:00",
  "running_time": 7.114,
  "total_elapsed_time": 7.402,
  "execution_time": 7.108442,
  "features": [
    {
      "code": "customer_information_read",
      "status_reason": "FEATURE_COMPLETED"
    },
    {
      "code": "accounts_read",
      "status_reason": "FEATURE_COMPLETED"
    },
    {
      "code": "cards_read",
      "status_reason": "FEATURE_COMPLETED"
    },
    {
      "code": "loans_read",
      "status_reason": "FEATURE_PARTIAL"
    }
  ],
  "messages": [
    {
      "date": "2026-09-12T10:16:00+00:00",
      "type": "warning",
      "id": "partial_products",
      "loc": [
        "loans_read"
      ],
      "message": "Some loan details could not be read and were left out."
    }
  ]
}
```

**SDK Code**

```python Finished, with a gap in one feature
import requests

url = "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Finished, with a gap in one feature
const url = 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Finished, with a gap in one feature
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Finished, with a gap in one feature
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java Finished, with a gap in one feature
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php Finished, with a gap in one feature
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Finished, with a gap in one feature
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Finished, with a gap in one feature
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Closed in two seconds: the source refused the credentials

**Response**

```json
{
  "execution_id": "6aa3d8b418d1c5dc9a8e3d36",
  "session_id": "5aa3dca503e37e6809539a58",
  "app_id": "4aa3dcbab3287e2385bb5cec",
  "customer_id": "my-customer-1",
  "engine_reference": "DEMOBANKXXXXFIN100ES9999-mobile",
  "auth_origin": "app-secret",
  "status_reason": "INCORRECT_CREDENTIALS",
  "products_count": {},
  "end_hook": "delivered",
  "status_code": "AUTH_ERROR",
  "is_closed": true,
  "warnings_count": 0,
  "errors_count": 0,
  "external_execution_id": "case-A-1029",
  "locking_hash": "v1.36GHPwfDK-UUZGG4fb1jtg",
  "authentication_status": "INCORRECT_CREDENTIALS",
  "date_created": "2026-09-12T10:17:16+00:00",
  "date_started": "2026-09-12T10:17:16+00:00",
  "date_ended": "2026-09-12T10:17:18+00:00",
  "running_time": 2.686,
  "total_elapsed_time": 2.949,
  "execution_time": 2.943195,
  "features": [
    {
      "code": "customer_information_read",
      "status_reason": "FEATURE_ABORTED"
    },
    {
      "code": "accounts_read",
      "status_reason": "FEATURE_ABORTED"
    },
    {
      "code": "cards_read",
      "status_reason": "FEATURE_ABORTED"
    },
    {
      "code": "loans_read",
      "status_reason": "FEATURE_ABORTED"
    }
  ]
}
```

**SDK Code**

```python Closed in two seconds: the source refused the credentials
import requests

url = "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Closed in two seconds: the source refused the credentials
const url = 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Closed in two seconds: the source refused the credentials
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Closed in two seconds: the source refused the credentials
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java Closed in two seconds: the source refused the credentials
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php Closed in two seconds: the source refused the credentials
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Closed in two seconds: the source refused the credentials
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Closed in two seconds: the source refused the credentials
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Still working

**Response**

```json
{
  "execution_id": "6aa3d8b418d1c5dc9a8e3d36",
  "session_id": "5aa3dca503e37e6809539a58",
  "app_id": "4aa3dcbab3287e2385bb5cec",
  "customer_id": "my-customer-1",
  "engine_reference": "DEMOBANKXXXXFIN100ES9999-mobile",
  "auth_origin": "app-secret",
  "status_reason": "RUNNING",
  "products_count": {},
  "end_hook": "pending",
  "status_code": "ONGOING",
  "is_closed": false,
  "warnings_count": 0,
  "errors_count": 0,
  "external_execution_id": "case-A-1029",
  "locking_hash": "v1.36GHPwfDK-UUZGG4fb1jtg",
  "authentication_status": "AUTH_OK",
  "date_created": "2026-09-12T10:18:51+00:00",
  "date_started": "2026-09-12T10:18:52+00:00",
  "running_time": 13.329818,
  "total_elapsed_time": 13.778833,
  "execution_time": 13.329842,
  "features": [
    {
      "code": "customer_information_read",
      "status_reason": "FEATURE_ACCEPTED"
    },
    {
      "code": "accounts_read",
      "status_reason": "FEATURE_ACCEPTED"
    },
    {
      "code": "cards_read",
      "status_reason": "FEATURE_ACCEPTED"
    },
    {
      "code": "loans_read",
      "status_reason": "FEATURE_ACCEPTED"
    }
  ]
}
```

**SDK Code**

```python Still working
import requests

url = "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Still working
const url = 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Still working
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Still working
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java Still working
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php Still working
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Still working
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Still working
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/handler/v1/6aa3d8b418d1c5dc9a8e3d36")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```