From a33a2eb2959fed180a6c19bae7de3088158f7dbf Mon Sep 17 00:00:00 2001
From: Jorge Echevarria Uribarri
 <jorge.echevarriauribarri.practicas@telefonica.com>
Date: Fri, 18 Oct 2024 12:17:38 +0200
Subject: [PATCH] SDK v0.2 (#3)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

PR:
- Improved documentation,
- Added and improved network-app samples,
- License draft v0.1.

---------

Co-authored-by: JorgeEcheva26 <jorge.echevarriauribarri.practicas@telefonica.es>
Co-authored-by: Daniel García <daniel.garciasanchez@telefonica.com>
---
 .gitignore                                    |   8 +-
 LICENSE                                       |  16 ++
 README.md                                     |  94 ++++++-----
 config/capif_sdk_config.json                  |  68 ++++----
 doc/images/OpenCAPIF_icon.jpg                 | Bin 0 -> 7218 bytes
 doc/sdk_configuration.md                      |   2 +-
 doc/sdk_full_documentation.md                 | 153 +++++++++++-------
 .../capif_sdk_config_sample.json              |  28 ++--
 .../network_app_invoker.py                    |   9 +-
 .../capif_sdk_config_sample.json              |   6 +-
 .../nef_upf_vendor_1.json                     |   6 +-
 .../nef_upf_vendor_2.json                     |  10 +-
 .../network_app_provider.py                   |  21 ++-
 pyproject.toml                                |  68 ++++++++
 samples/provider_api_description_sample.json  |   2 +-
 sdk/capif_provider_connector.py               |  34 ++--
 sdk/service_discoverer.py                     |   6 +
 test/capif_sdk_config_sample_test.json        |  67 ++++----
 test/network_app_provider_api_spec.json       |   2 +-
 test/network_app_provider_api_spec_2.json     |   2 +-
 test/network_app_provider_api_spec_3.json     |   2 +-
 test/test.py                                  |   4 +-
 22 files changed, 387 insertions(+), 221 deletions(-)
 create mode 100644 LICENSE
 create mode 100644 doc/images/OpenCAPIF_icon.jpg
 create mode 100644 pyproject.toml

diff --git a/.gitignore b/.gitignore
index 5b3ea25..0781cbd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -163,8 +163,10 @@ cython_debug/
 
 */logs
 
+
 config
 
+
 *.vscode
 
 .flake8
@@ -173,5 +175,7 @@ config
 
 */__pycache__
 
-*.capif_sdk_config_sample_test
-test/capif_sdk_config_sample_test.json
+
+*.capif_sdk_config_sample_test.json
+/test/capif_sdk_config_sample_test.json
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..224e177
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,16 @@
+Apache Software License 2.0
+ 
+Copyright (c) 2021, Stavros Kolometsos
+Copyright (c) 2024, Jorge Echevarría, Daniel García
+ 
+Licensed under the Apache License, Version 2.0 (the “License”);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ 
+http://www.apache.org/licenses/LICENSE-2.0
+ 
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an “AS IS” BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
index edd3b21..f5d5bff 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,7 @@ Current version of OpenCAPIF SDK is compatible with following publicly available
 This document serves as the [main bootstrap reference](#networkapp-developer-path) to start working with OpenCAPIF SDK. For advanced users, refer to [OpenCAPIF full documentation](./doc/sdk_full_documentation.md) section to dig into all available features.
 
 # Table of Contents
+
  1. [Repository structure](#repository-structure) 
  2. [Network App developers](#network-app-developers)
  3. [OpenCAPIF SDK summary](#opencapif-sdk-summary)
@@ -26,6 +27,7 @@ This document serves as the [main bootstrap reference](#networkapp-developer-pat
  8. [OpenCAPIF SDK known issues](#opencapif-sdk-known-issues)
  9. [OpenCAPIF SDK developers](./doc/sdk_developers.md)
 
+
 # Repository structure
 
     pesp_capif_sdk
@@ -65,11 +67,13 @@ For that purpose Network Apps play 2 different roles when interacting with CAPIF
 - **Invoker**: a Network App acting as an Invoker is responsible for consuming APIs exposed by other services. This role represents an external application or service that  calls the 3GPP northbound APIs to utilize the network’s functionalities.
 
 - **Provider**: a Network App acting as a Provider is responsible for exposing its own APIs//services for use by Invokers. This role represents an entity that offers services through APIs, making them available to other external applications or Invokers.A provider also is distinguished for having three parts.
-  - The AMF, supplies the API provider domain with administrative capabilities. Some of these capabilities include, auditing the service API invocation logs received from the CCF, on-boarding/off-boarding new API invokers and monitoring the status of the service APIs.One provider can have only one AMF,
 
-  - The APF (API Publishing Function), is responsible for the publication of the service APIs to CCF in order to enable the discovery capability to the API Invokers.One provider can have multiple APFs,
+  - The AMF(API Management function), supplies the API provider domain with administrative capabilities. Some of these capabilities include, auditing the service API invocation logs received from the CCF, on-boarding/off-boarding new API invokers and monitoring the status of the service APIs.One provider can have only one AMF.
+
+  - The APF (API Publishing Function), is responsible for the publication of the service APIs to CCF in order to enable the discovery capability to the API Invokers.One provider can have multiple APFs.
+
+  - AEF(API Exposing Function), is responsible for the exposure of the service APIs. Assuming that API Invokers are authorized by the CCF, AEF validates the authorization and subsequently provides the direct communication entry points to the service APIs. AEF may also authorize API invokers and record the invocations in log files.One provider can have multiple AEFs
 
-  - AEF(API Exposing Function), is responsible for the exposure of the service APIs. Assuming that API Invokers are authorized by the CCF, AEF validates the authorization and subsequently provides the direct communication entry points to the service APIs. AEF may also authorize API invokers and record the invocations in log files.One provider can have multiple AEFs.
 
 **Network Apps developers are the target users of OpenCAPIF SDK.**
 
@@ -77,22 +81,23 @@ For that purpose Network Apps play 2 different roles when interacting with CAPIF
 
 OpenCAPIF SDK brings a set of functions to integrate with the 5G Core's function CAPIF, as defined in [3GPP Technical Specification (TS) 29.222 V18.5.0 Common API Framework for 3GPP Northbound APIs](https://www.etsi.org/deliver/etsi_ts/129200_129299/129222/18.05.00_60/ts_129222v180500p.pdf). This section shows the mapping between the Python functions available in this SDK and the CAPIF OpenAPI APIs defined the reference standard:
 
-  | **3GPP CAPIF API**                                    | **OpenCAPIF SDK function**                                  | **Description**                                             |
-  |-------------------------------------------------------|-------------------------------------------------------------|-------------------------------------------------------------|
-  | /onboardedInvokers (POST)                             | [onboard_invoker()](./doc/sdk_full_documentation.md#invoker-onboarding)                                           | Registers a new invoker.                                    |
-  | /onboardedInvokers/{onboardingId} (PUT)               | [update_invoker()](./doc/sdk_full_documentation.md#update-and-offboard-invoker)                                          | Updates an existing invoker for a specific `onboardingId`.                                |
-  | /onboardedInvokers/{onboardingId} (DELETE)            | [offboard_invoker()](./doc/sdk_full_documentation.md#update-and-offboard-invoker)                                         | Deletes an invoker for a specific `onboardingId`.                                         |
-  | registrations (POST)                                  | [onboard_provider()](./doc/sdk_full_documentation.md#provider-onboarding)                                          | Registers a new service provider.                           |
-  | /registrations/{registrationId} (PUT)                 | [update_provider()](./doc/sdk_full_documentation.md#update-and-offboard-provider)                                           | Updates a service provider's registration for a specific `registrationId`.                  |
-  | /registrations/{registrationId} (DELETE)              | [offboard_provider()](./doc/sdk_full_documentation.md#update-and-offboard-provider)                                         | Deletes a service provider's registration for a specific `registrationId`.                  |
-  | /allServiceAPIs (GET)                                 | [discover()](./doc/sdk_full_documentation.md#discover-process)                                                  | Retrieves a list of all available service APIs.             |
-  | /trustedInvokers (PUT//POST)                          | [discover()](./doc/sdk_full_documentation.md#discover-process)                                                  | Registers or updates trusted invokers.                      |
-  | /securities/{securityId}/token (GET)                  | [get_tokens()](./doc/sdk_full_documentation.md#obtain-invoker-tokens)                                                | Retrieves a security token for a specific `securityId`. This JWT token is used to query the targeted services.      |
-  | /{apfId}/service-apis(POST)                           | [publish_services()](./doc/sdk_full_documentation.md#services-publishing)                                          | Registers a new service API into the system for a specific `apfId`                |
-  | /{apfId}/service-apis/{serviceApiId} (DELETE)         | [unpublish_service()](./doc/sdk_full_documentation.md#services-deletion)                                         | Deletes a service API from the system for a specific `apfId`and `serviceApiId`                      |
-  | /{apfId}/service-apis/{serviceApiId} (PUT)            | [update_service()](./doc/sdk_full_documentation.md#services-update)                                            | Updates the details of an existing service API for a specific `apfId`and `serviceApiId`             |
-  | /{apfId}/service-apis/{serviceApiId} (GET)                           | [get_service()](./doc/sdk_full_documentation.md#get-services)                                               | Retrieves the details of a specific service API for a specific `apfId` and `serviceApiId`           |
-  | /{apfId}/service-apis (GET)            | [get_all_services()](./doc/sdk_full_documentation.md#get-all-services)                                          | Retrieves a list of all available service APIs for a specific `apfId`            |
+| **3GPP CAPIF API**                                    | **OpenCAPIF SDK function**                                  | **Description**                                             |
+|-------------------------------------------------------|-------------------------------------------------------------|-------------------------------------------------------------|
+| /onboardedInvokers (POST)                             | [onboard_invoker()](./doc/sdk_full_documentation.md#invoker-onboarding)                                           | Registers a new invoker.                                    |
+| /onboardedInvokers/{onboardingId} (PUT)               | [update_invoker()](./doc/sdk_full_documentation.md#update-and-offboard-invoker)                                          | Updates an existing invoker for a specific `onboardingId`.                                |
+| /onboardedInvokers/{onboardingId} (DELETE)            | [offboard_invoker()](./doc/sdk_full_documentation.md#update-and-offboard-invoker)                                         | Deletes an invoker for a specific `onboardingId`.                                         |
+| registrations (POST)                                  | [onboard_provider()](./doc/sdk_full_documentation.md#provider-onboarding)                                          | Registers a new service provider.                           |
+| /registrations/{registrationId} (PUT)                 | [update_provider()](./doc/sdk_full_documentation.md#update-and-offboard-provider)                                           | Updates a service provider's registration for a specific `registrationId`.                  |
+| /registrations/{registrationId} (DELETE)              | [offboard_provider()](./doc/sdk_full_documentation.md#update-and-offboard-provider)                                         | Deletes a service provider's registration for a specific `registrationId`.                  |
+| /allServiceAPIs (GET)                                 | [discover()](./doc/sdk_full_documentation.md#discover-process)                                                  | Retrieves a list of all available service APIs.             |
+| /trustedInvokers (PUT//POST)                          | [get_tokens()](./doc/sdk_full_documentation.md#discover-process)                                                  | Registers or updates trusted invokers.                      |
+| /securities/{securityId}/token (GET)                  | [get_tokens()](./doc/sdk_full_documentation.md#obtain-invoker-tokens)                                                | Retrieves a security token for a specific `securityId`. This JWT token is used to query the targeted services.      |
+| /{apfId}/service-apis(POST)                           | [publish_services()](./doc/sdk_full_documentation.md#services-publishing)                                          | Registers a new service API into the system for a specific `apfId`                |
+| /{apfId}/service-apis/{serviceApiId} (DELETE)         | [unpublish_service()](./doc/sdk_full_documentation.md#services-deletion)                                         | Deletes a service API from the system for a specific `apfId`and `serviceApiId`                      |
+| /{apfId}/service-apis/{serviceApiId} (PUT)            | [update_service()](./doc/sdk_full_documentation.md#services-update)                                            | Updates the details of an existing service API for a specific `apfId`and `serviceApiId`             |
+| /{apfId}/service-apis/{serviceApiId} (GET)                           | [get_service()](./doc/sdk_full_documentation.md#get-services)                                               | Retrieves the details of a specific service API for a specific `apfId` and `serviceApiId`           |
+| /{apfId}/service-apis (GET)            | [get_all_services()](./doc/sdk_full_documentation.md#get-all-services)                                          | Retrieves a list of all available service APIs for a specific `apfId`            |
+
 
 
 NOTE: Above mentioned CAPIF APIs are defined in these 3GPP references:
@@ -128,16 +133,15 @@ Now, it is described in 4 simple steps how a Provider can be developed in just s
 ```python
   provider = capif_provider_connector(config_file="path/to/the/capif_sdk_config.json")
   provider.onboard_provider()
-  capif_connector.api_description_path = "./nef-upf-partner-1.json"
-  provider_folder = capif_connector.provider_folder
+  provider.api_description_path = "./nef_upf_vendor_1.json"
 
-  APF = capif_connector.api_prov_funcs["APF-1"]
+  APF = provider.api_prov_funcs["APF-1"]
 
-  AEF1 = capif_connector.api_prov_funcs["AEF-1"]
-  AEF2 = capif_connector.api_prov_funcs["AEF-2"]
+  AEF1 = provider.api_prov_funcs["AEF-1"]
+  AEF2 = provider.api_prov_funcs["AEF-2"]
 
-  capif_connector.publish_req['publisher_apf_id'] = APF
-  capif_connector.publish_req['publisher_aefs_ids'] = [AEF1, AEF2]
+  provider.publish_req['publisher_apf_id'] = APF
+  provider.publish_req['publisher_aefs_ids'] = [AEF1, AEF2]
   provider.publish_services()
 ```
 
@@ -168,7 +172,7 @@ Code is next explained step by step:
 
     The api_prov_funcs variable is a dictionary which contains key-values of all the APFs and AEFs stored as name: ID.
 
-    This publish_req field can also be filled with object variables already stored at capif_connector.
+    This publish_req field can also be filled with object variables already stored at provider object.
 
 4. **Publish the services:** \
    Use the publish_services() method to register the APIs with the CAPIF framework(don't forget to update the capif_provider_connector constructor in order to use the new APF and AEFs):
@@ -192,9 +196,15 @@ Within the `provider_folder`, the SDK stores the created folders named with pref
 - `capif_provider_details.json`: contains all the APFs and AEFs ids that have already onboarded with this `capif_username`,
 - `capif_<api_name>_<api_id>.json`: if it is already published or updated an API, it will contain a copy of the last payload,
 - `service_received.json`: if it is already used to get an API or get all APIs functionality, it will contain the response of last request,
-- `published-apis.json`: contains the currently published APIs with their `api_id`.
+- `published_apis.json`: contains the currently published APIs with their `api_id`.
+
+All the configuration values are available within the object capif_provider_connector.
+
+The api_prov_funcs variable stores the `capif_provider_details.json` content in a dictionary form.
+
+The published_apis variable stores the `published_apis.json` content in a dictionary form.
+
 
-All the configuration values are available within the object capif_provider_connector, also the api_prov_funcs variable is a dict which contains as a key all the APFs and AEFs, as a value contains all APFs and AEFs ids.
 
 
 ## Invoker Network App
@@ -208,9 +218,10 @@ Now, it is described in some simple steps how an Invoker can be developed in jus
 ```python
   invoker = capif_invoker_connector(config_file="path/to/the/capif_sdk_config.json")
   invoker.onboard_invoker()
-  service_discoverer = ServiceDiscoverer(config_file=utilities.get_config_file())
+  service_discoverer = service_discoverer(config_file="path/to/the/capif_sdk_config.json")
   service_discoverer.discover()
   service_discoverer.get_tokens()
+  jwt_token=service_discoverer.token
 ```
 
 Code is next explained step by step:
@@ -277,16 +288,21 @@ In the `invoker_folder`, it will be located several folders with each `capif_use
     2. If the Service Discovery Functionality has already been used , it will be found all the available APIs with their information,
     3. If the Service Get Token functionality has already been used , it will be found the access token for using the APIs that has already been discovered.
 
+The `token` variable is also available for retrieving the JWT token after the get_tokens() method.
+
+The capif_api_details variable stores the `capif_api_security_context_details.json` content in a dictionary form.
 
 # OpenCAPIF SDK known issues
 
 There are some features which **are not currently available at latest OpenCAPIF SDK release**. Those are assumed to be technical debt and might be available in future releases: 
-  - [CAPIF Access control policy management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Access_Control_Policy_API.yaml),
-  - [CAPIF Auditing API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Auditing_API.yaml),
-  - [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml),
-  - [CAPIF Logging API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Logging_API_Invocation_API.yaml),
-  - [CAPIF Routing info API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Routing_Info_API.yaml),
-  - [CAPIF Security API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Security_API.yaml):
-    - /trustedInvokers/{apiInvokerId}/delete (POST),
-    - /trustedInvokers/{apiInvokerId} (GET),
-    - /trustedInvokers/{apiInvokerId} (DELETE).
+
+  - [CAPIF Access control policy management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Access_Control_Policy_API.yaml)
+  - [CAPIF Auditing API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Auditing_API.yaml)
+  - [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml)
+  - [CAPIF Logging API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Logging_API_Invocation_API.yaml)
+  - [CAPIF Routing info API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Routing_Info_API.yaml)
+  - [CAPIF Security API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Security_API.yaml)
+    - /trustedInvokers/{apiInvokerId}/delete (POST)
+    - /trustedInvokers/{apiInvokerId} (GET)
+    - /trustedInvokers/{apiInvokerId} (DELETE)
+  - [AEF_Security_API](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_AEF_Security_API.yaml)
diff --git a/config/capif_sdk_config.json b/config/capif_sdk_config.json
index 2e16e6d..a44b8b4 100644
--- a/config/capif_sdk_config.json
+++ b/config/capif_sdk_config.json
@@ -1,22 +1,23 @@
 {
-  "capif_host": "capif-prev.mobilesandbox.cloud",
-  "register_host": "registercapif-prev.mobilesandbox.cloud",
-  "capif_https_port": "36212",
-  "capif_register_port": "36211",
-  "capif_username": "echeva_0",
-  "capif_password": "echevapass",
-  "debug_mode": "False",
-  "invoker":{
-    "invoker_folder": "/Users/IDB0128/Documents/OpenCapif/test_invoker_certificate_folder",
-    "capif_callback_url": "http://localhost:5000",
-    "cert_generation":{
-      "csr_common_name": "invoker",
-      "csr_organizational_unit": "test_app_ou",
-      "csr_organization": "test_app_o",
-      "crs_locality": "Madrid",
-      "csr_state_or_province_name": "Madrid",
-      "csr_country_name": "ES",
-      "csr_email_address": "test@example.com"
+  "capif_host": "",
+  "register_host": "",
+  "capif_https_port": "",
+  "capif_register_port": "",
+  "capif_username": "",
+  "capif_password": "",
+  "debug_mode": "",
+  "invoker": {
+    "invoker_folder": "",
+    "capif_callback_url": "",
+    "cert_generation": {
+      "csr_common_name": "",
+      "csr_organizational_unit": "",
+      "csr_organization": "",
+      "crs_locality": "",
+      "csr_state_or_province_name": "",
+      "csr_country_name": "",
+      "csr_email_address": ""
+
     },
     "discover_filter": {
       "api-name": "",
@@ -34,10 +35,11 @@
       "service-kpis": ""
     }
   },
-  "provider":{
-    "provider_folder": "/Users/IDB0128/Documents/OpenCapif/test_provider_certificate_folder",
-    "apfs": "1",
-    "aefs": "2",
+
+  "provider": {
+    "provider_folder": "",
+    "apfs": "",
+    "aefs": "",
     "publish_req": {
       "service_api_id": "",
       "publisher_apf_id": "",
@@ -46,15 +48,15 @@
         ""
       ]
     },
-    "cert_generation":{
-      "csr_common_name": "provider",
-      "csr_organizational_unit": "test_app_ou",
-      "csr_organization": "test_app_o",
-      "crs_locality": "Madrid",
-      "csr_state_or_province_name": "Madrid",
-      "csr_country_name": "ES",
-      "csr_email_address": "test@example.com"
+    "cert_generation": {
+      "csr_common_name": "",
+      "csr_organizational_unit": "",
+      "csr_organization": "",
+      "crs_locality": "",
+      "csr_state_or_province_name": "",
+      "csr_country_name": "",
+      "csr_email_address": ""
     },
-    "api_description_path": "/Users/IDB0128/git_repos/pesp_capif_sdk/samples/provider_api_description_sample.json"
-  }
-}
\ No newline at end of file
+    "api_description_path": ""
+   }
+}
diff --git a/doc/images/OpenCAPIF_icon.jpg b/doc/images/OpenCAPIF_icon.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8ae5c10e186e12481f1e65f36b69ac722f057775
GIT binary patch
literal 7218
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
A(f|Me

literal 0
HcmV?d00001

diff --git a/doc/sdk_configuration.md b/doc/sdk_configuration.md
index b90e80a..89253ca 100644
--- a/doc/sdk_configuration.md
+++ b/doc/sdk_configuration.md
@@ -65,7 +65,7 @@ This section is mandatory when using the [CAPIF Publish Service API](https://git
 
 The `api_description_path` must point to the Publish API to be shared, and it should follow the [ServiceAPIDescription](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Publish_Service_API.yaml) schema.
 
-If the `publisherAEFsids` do not match the `aefProfiles` in the API description, an error will be raised by the SDK.
+If the `publisher_aefs_ids` do not match the `aefProfiles` in the API description, an error will be raised by the SDK.
 
 ## Descriptions of `capif_sdk_config` Fields
 
diff --git a/doc/sdk_full_documentation.md b/doc/sdk_full_documentation.md
index 016cf4f..1293303 100644
--- a/doc/sdk_full_documentation.md
+++ b/doc/sdk_full_documentation.md
@@ -1,35 +1,39 @@
+
 # OpenCAPIF SDK full documentation
 
-The OpenCAPIF SDK simplifies the integration of applications with the CAPIF NF, offering several features for both manual use and automated scripting, as well as direct integration into application code.
+The OpenCAPIF SDK facilitates the integration of applications with the CAPIF NF. It offers various features for manual usage, automated scripting, and direct integration into application code.
 
-This documentation provides a step-by-step guide on how to use the SDK, explaining each functionality in detail. Before diving into the specifics, ensure the necessary prerequisites are met and learn about the available testing modes for the SDK.
+This documentation provides a step-by-step guide for utilizing the SDK, detailing its functionalities. Before proceeding, ensure all prerequisites are met, and review the available testing modes for the SDK.
 
 ## Getting Started
 
-Before using the SDK, make sure the following steps have been completed:
-- Fulfill the [requirements](../README.md) section,
+Before using the SDK, the following steps should be completed:
+- Meet the [requirements](../README.md),
 - Follow the [installation instructions](./sdk_developers.md),
-- Configure the SDK by completing the relevant parts of the [configuration](./sdk_configuration.md) section, based on the CAPIF role your NetApp will perform.
+- Configure the SDK by completing the relevant sections in the [configuration guide](./sdk_configuration.md), depending on the CAPIF role the Network App will assume.
+
 
 ## Available SDK Usage Modes
 
-![GENERAL CAPIF USAGE FLOW](./images/flows_opencapif_actual.jpg)
+![GENERAL CAPIF USAGE FLOW](./images/flows_updated_opencapif.jpg)
+
 
-This repository provides 2 modes for using OpenCAPIF SDK:
+The repository provides two modes for utilizing the OpenCAPIF SDK:
 
-1. **Development Mode**: Import the SDK into your code and start developing. Sample applications using the SDK are provided in the [network_app_samples](../netapp-samples/) folder.
+1. **Development Mode**: The SDK can be imported directly into code for development purposes. Sample applications using the SDK are available in the [network_app_samples](../network_app_samples/) folder.
 
-2. **Manual Mode**: Use a set of Python [scripts](../scripts/) to test each step of the integration process manually. For manual usage, it is essential to complete the utilities file with absolute paths of the target environment to finalize SDK configuration.
+2. **Manual Mode**: A set of Python [scripts](../scripts/) can be used to manually test each integration step. For manual usage, it is necessary to complete the utilities file with absolute paths from the target environment to finalize SDK configuration.
 
-**IMPORTANT**: all SDK configuration files must be filled out depending on the role and features planned to be used. For further details, refer to the [Configuration Section](./sdk_configuration.md).
+**IMPORTANT**: All SDK configuration files must be filled out based on the intended role and features. Further details can be found in the [Configuration Section](./sdk_configuration.md).
 
-**NOTE**: register file is not required for SDK usage, just for SDK developers.
+**NOTE**: The register file is not required for SDK usage, only for SDK consumers that wish to create their capif_username.
 
 ## Table of Contents
 
-As outlined in the [Network App developers section](../README.md), OpenCAPIF SDK supports two primary roles:
+As outlined in the [Network App developers section](../README.md), the OpenCAPIF SDK supports two primary roles:
 
-- [Provider NetApp](#provider-netapp)
+
+- [Provider Network App](#provider-network-app)
     - [Important Information for Providers](#important-information-for-providers)
     - [Provider Onboarding](#provider-onboarding)
     - [Service Publishing](#services-publishing)
@@ -38,7 +42,7 @@ As outlined in the [Network App developers section](../README.md), OpenCAPIF SDK
     - [Get Published Services](#get-services)
     - [Get All Published Services](#get-all-services)
     - [Update and Offboard Provider](#update-and-offboard-provider)
-- [Invoker NetApp](#invoker-netapp)
+- [Invoker Network App](#invoker-network-app)
     - [Important Information for Invokers](#important-information-for-invokers)
     - [Invoker Onboarding](#invoker-onboarding)
     - [Service Discovery](#discover-process)
@@ -48,20 +52,26 @@ As outlined in the [Network App developers section](../README.md), OpenCAPIF SDK
     - [CAPIF Registration and Login](#capif-registration-and-login)
     - [CAPIF Deregistration and Logout](#capif-registration-and-login)
 
-## Provider NetApp
+## Provider Network App
+
 
-The OpenCAPIF SDK allows developers to quickly implement the provider flow for NetApp using just a few lines of code. This section provides a comprehensive guide to the SDK features related to CAPIF providers.
+The OpenCAPIF SDK allows the provider flow for Network-App to be implemented with minimal code. This section provides a comprehensive overview of the SDK features relevant to CAPIF providers.
 
 ### Important Information for Providers
 
-Inside the `provider_folder`, the SDK stores directories named after the registered `capif_username`. Each folder contains:
+Within the `provider_folder`, directories are created based on the registered `capif_username`. Each folder contains:
 
-- `capif_provider_details.json`: Contains all APFs and AEFs IDs that have been onboarded with the associated username.
-- `capif_<api_name>_<api_id>.json`: Stores a copy of the last payload for any published or updated API.
-- `service_received.json`: Stores responses for the Get API or Get All APIs functionality.
-- `published-apis.json`: Contains a list of currently published APIs with their respective IDs.
+- `capif_provider_details.json`: Contains all APFs and AEFs IDs onboarded with the associated username.
+- `capif_<api_name>_<api_id>.json`: Stores the last payload for any published or updated API.
+- `service_received.json`: Stores responses for Get API or Get All APIs.
+- `published_apis.json`: A list of currently published APIs along with their IDs.
+
+All the configuration values are available within the object capif_provider_connector.
+
+The api_prov_funcs variable stores the `capif_provider_details.json` content in a dictionary form.
+
+The published_apis variable stores the `published_apis.json` content in a dictionary form.
 
-All configuration values are available within the `capif_provider_connector` object. Additionally, the `api_prov_funcs` variable is a dictionary where APFs and AEFs are the keys, and their respective IDs are the values.
 
 ### Provider Onboarding
 
@@ -69,7 +79,9 @@ OpenCAPIF SDK references:
 - **Function**: `onboard_provider()`
 - **Script**: `provider_capif_connector.py`
 
-The SDK streamlines the onboarding process for providers, allowing them to register multiple APFs and AEFs as needed.
+
+The SDK simplifies the onboarding process, allowing providers to register multiple APFs and AEFs. All APFs, AEFs, and AMF certificates are created and stored in `capif_provider_details.json`.
+
 
 ![Provider_onboard](./images/flows_provider_onboard.jpg)
 
@@ -79,11 +91,12 @@ OpenCAPIF SDK references:
 - **Function**: `publish_services()`
 - **Script**: `provider_publish_api.py`
 
-The SDK simplifies the process of publishing an API in CAPIF, with the option to select specific APFs and AEFs. Before publishing, ensure you’ve [onboarded as a provider](#provider-onboarding).
+
+The SDK streamlines API publishing with the option to select specific APFs and AEFs. A copy of the uploaded API is stored in `capif_<api_name>_<api_id>.json`, and the `published_apis.json` is updated with the API name and its ID.
 
 **Required SDK inputs**:
-- PublisherAPFid
-- PublisherAEFsids
+- publisher_apf_id
+- publisher_aefs_ids
 
 ### Service Deletion
 
@@ -91,12 +104,14 @@ OpenCAPIF SDK references:
 - **Function**: `unpublish_service()`
 - **Script**: `provider_unpublish_api.py`
 
-The SDK simplifies API deletion in CAPIF. To delete a service, you must be [onboarded as a provider](#provider-onboarding) and have [published a service](#services-publishing) beforehand.
+
+The SDK simplifies API deletion. Service deletion requires prior onboarding and service publication.
+
 
 **Required SDK inputs**:
-- ServiceApiId
-- PublisherAPFid
-- PublisherAEFsids
+- service_api_id
+- publisher_apf_id
+- publisher_aefs_ids
 
 ### Service Updates
 
@@ -104,12 +119,14 @@ OpenCAPIF SDK references:
 - **Function**: `update_service()`
 - **Script**: `provider_update_api.py`
 
-The SDK facilitates updating a previously registered API and allows selecting the APFs and AEFs used for the update. Ensure you’ve [onboarded as a provider](#provider-onboarding) and have [published a service](#services-publishing) beforehand.
+
+This function enables the updating of a previously registered API. Selecting APFs and AEFs is possible. Onboarding and service publishing are prerequisites.
+
 
 **Required SDK inputs**:
-- ServiceApiId
-- PublisherAPFid
-- PublisherAEFsids
+- service_api_id
+- publisher_apf_id
+- publisher_aefs_ids
 
 ### Get Services
 
@@ -117,11 +134,13 @@ OpenCAPIF SDK references:
 - **Function**: `get_service()`
 - **Script**: `provider_get_published_api.py`
 
-Retrieve information about a previously published service in `service_received.json`. Before retrieving services, you must be [onboarded as a provider](#provider-onboarding) and have [published a service](#services-publishing).
+
+Retrieve information on a previously published service, stored in `service_received.json`. Prior onboarding and service publication are necessary.
+
 
 **Required SDK inputs**:
-- ServiceApiId
-- PublisherAPFid
+- service_api_id
+- publisher_apf_id
 
 ### Get All Services
 
@@ -129,10 +148,12 @@ OpenCAPIF SDK references:
 - **Function**: `get_all_services()`
 - **Script**: `provider_get_all_published_api.py`
 
-Retrieve information about all previously published services in `service_received.json`. Ensure you are [onboarded as a provider](#provider-onboarding) and have [published services](#services-publishing).
 
-**Mandatory Field**:
-- PublisherAPFid
+Retrieve information on all previously published services, stored in `service_received.json`. Onboarding and service publication are required.
+
+**Required SDK input**:
+
+- publisher_apf_id
 
 ![Provider_publish](./images/flows_provider_publish_functions.jpg)
 
@@ -142,30 +163,40 @@ OpenCAPIF SDK references:
 - **Functions**: `update_provider()` and `offboard_provider()`
 - **Scripts**: `provider_capif_connector_update.py` and `provider_capif_connector_offboarding.py`
 
-You must be onboarded as a provider before using these features.
+
+The provider must be onboarded before using these features. The `capif_sdk_config.json` must be edited for updates.
+
 
 ![Provider_update-offboard](./images/flows_provider_update_offboard.jpg)
 
-## Invoker NetApp
+## Invoker Network App
 
-The OpenCAPIF SDK enables developers to implement invoker functionality for NetApp efficiently. This section provides a complete guide to SDK features related to CAPIF invokers.
+
+The OpenCAPIF SDK enables efficient implementation of invoker functionality for Network App. This section details the SDK features related to CAPIF invokers.
 
 ### Important Information for Invokers
 
-Inside the `invoker_folder`, the SDK stores directories named after the registered `capif_username`. Each folder contains:
+Within the `invoker_folder`, directories are created based on the registered `capif_username`. These directories contain:
+
 
 - `capif_api_security_context_details.json`: Stores details about the invoker, including:
     1. `api_invoker_id`
     2. Discovered APIs and their information (if Service Discovery has been used)
     3. JWT access tokens for discovered APIs (if Service Get Token functionality has been used)
 
+The `token` variable is also available for retrieving the JWT token after the get_tokens() functionality.
+
+The capif_api_details variable stores the `capif_api_security_context_details.json` content.
+
 ### Invoker Onboarding
 
 OpenCAPIF SDK references:
 - **Function**: `onboard_invoker()`
 - **Script**: `invoker_capif_connector.py`
 
-The SDK simplifies the invoker onboarding process.
+
+The SDK streamlines the invoker onboarding process, storing the `api_invoker_id` in the `capif_api_security_context_details.json`.
+
 
 ![Invoker_onboard](./images/flows_invoker_onboard.jpg)
 
@@ -175,9 +206,11 @@ OpenCAPIF SDK references:
 - **Function**: `discover()`
 - **Script**: `invoker_service_discover.py`
 
-Use the [discover_filter](./sdk_configuration.md) to retrieve access to target APIs. Ensure you are [onboarded as an invoker](#invoker-onboarding) before using this feature.
 
-**Note**: If this is the first time running `discover()`, you may receive a 404 warning, prompting registration for the security service.
+The [discover_filter](./sdk_configuration.md) can be used to retrieve access to APIs. The invoker must be onboarded before using this function. Discovered APIs and their information are stored in `capif_api_security_context_details.json`.
+
+**Note**: A 404 warning may be received during the first discovery run, prompting registration for the security service.
+
 
 ![Invoker_discover](./images/flows_invoker_discover.jpg)
 
@@ -187,32 +220,40 @@ OpenCAPIF SDK references:
 - **Function**: `get_tokens()`
 - **Script**: `invoker_service_get_token.py`
 
-The SDK streamlines the creation of a security context using JWT tokens, which allows access to target APIs. Ensure you are [onboarded as an invoker](#invoker-onboarding) and have used the [discover](#discover-process) function beforehand.
+
+The SDK facilitates JWT token creation for secure access to target APIs. This process stores JWT access token in `capif_api_security_context_details.json`.
+
 
 ![Invoker_get_token](./images/flows_invoker_get_tokens.jpg)
 
 ### Update and Offboard Invoker
 
 OpenCAPIF SDK references:
-- **Functions**: `update_invoker()` & `offboard_and_deregister_invoker()`
-- **Scripts**: `invoker_capif_connector_update.py` & `invoker_capif_connector_offboarding.py`
 
-Ensure you are [onboarded as an invoker](#invoker-onboarding) before using these features.
+- **Functions**: `update_invoker()` and `offboard_invoker()`
+- **Scripts**: `invoker_capif_connector_update.py` and `invoker_capif_connector_offboarding.py`
+
+Onboarding is required before utilizing these functions. The `capif_sdk_config.json` must be edited for updates.
+
 
 ![Invoker_update-offboard](./images/flows_invoker_update_offboard.jpg)
 
 ## Other Features
 
+
+### CAPIF Registration and Login
+
 OpenCAPIF SDK reference:
-* **OpenCAPIF SDK script**: <mark>register_and_login.py</mark>
+* **Script**: `register_and_login.py`
 
-Eases the logging process for admin users and creates a CAPIF user,
+Simplifies the login process for admin users and creates a CAPIF user.
 
-### CAPIF deregistration and logout 
+### CAPIF Deregistration and Logout 
 
 OpenCAPIF SDK reference:
-* **OpenCAPIF SDK script**: <mark>deregister_and_login.py</mark>
+* **Script**: `deregister_and_login.py`
+
+Simplifies the logout process for admin users and removes a CAPIF user.
 
-Eases the logging process for admin users and removes a CAPIF user.
 
 ![Register picture](./images/flows_sdk_with_register.jpg)
diff --git a/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json b/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json
index 441d8d8..bec14c2 100644
--- a/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json
+++ b/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json
@@ -9,7 +9,7 @@
   "invoker":{
     "invoker_folder": "/Users/IDB0128/Documents/OpenCapif/test_invoker_certificate_folder",
     "capif_callback_url": "http://localhost:5000",
-    "csr_generation":{
+    "cert_generation":{
       "csr_common_name": "invoker",
       "csr_organizational_unit": "test_app_ou",
       "csr_organization": "test_app_o",
@@ -35,26 +35,26 @@
     }
   },
   "provider":{
-    "provider_folder": "/Users/IDB0128/Documents/OpenCapif/test_provider_certificate_folder",
+    "provider_folder": "",
     "apfs": 1,
     "aefs": 3,
     "publish_req": {
-      "service_api_id": "80dbdd52ee766d4ad4494264e4289c",
-      "publisher_apf_id": "APF73e3458fb483c3c65f2f7e126ec851",
+      "service_api_id": "",
+      "publisher_apf_id": "",
       "publisher_aefs_ids": [
-        "AEF07a01ccd74a160c195e69b4f116d66",
-        "AEFb5c206b46fc68c192aed6870899ea1"
+        "",
+        ""
       ]
     },
     "cert_generation":{
-      "csr_common_name": "provider",
-      "csr_organizational_unit": "test_app_ou",
-      "csr_organization": "test_app_o",
-      "crs_locality": "Madrid",
-      "csr_state_or_province_name": "Madrid",
-      "csr_country_name": "ES",
-      "csr_email_address": "test@example.com"
+      "csr_common_name": "",
+      "csr_organizational_unit": "",
+      "csr_organization": "",
+      "crs_locality": "",
+      "csr_state_or_province_name": "",
+      "csr_country_name": "",
+      "csr_email_address": ""
     },
-    "api_description_path": "/Users/IDB0128/git_repos/pesp_capif_sdk/samples/provider_api_description_sample.json"
+    "api_description_path": ""
   }
 }
diff --git a/network_app_samples/network_app_invoker_sample/network_app_invoker.py b/network_app_samples/network_app_invoker_sample/network_app_invoker.py
index 17407be..604fd6f 100644
--- a/network_app_samples/network_app_invoker_sample/network_app_invoker.py
+++ b/network_app_samples/network_app_invoker_sample/network_app_invoker.py
@@ -98,15 +98,12 @@ if __name__ == "__main__":
         discoverer.get_tokens()
 
         # Load API details from the JSON file
-        apidetailspath = os.path.join(capif_connector.invoker_folder,
-                                      f"capif_api_security_context_details-{capif_connector.capif_username}.json")
-        with open(apidetailspath, 'r') as file:
-            apidetails = json.load(file)
+        token = discoverer.token
 
         # Update the Postman token with the retrieved access token
-        update_token(apidetails['access_token'])
+        update_token(token)
 
-        print(apidetails['access_token'])
+        print(token)
 
         # Wait for 599 seconds before the next update
         time.sleep(599)
diff --git a/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json b/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json
index b9613df..e104459 100644
--- a/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json
+++ b/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json
@@ -5,11 +5,11 @@
   "capif_register_port": "36211",
   "capif_username": "echeva_0",
   "capif_password": "echevapass",
-  "debug_mode": "True",
+  "debug_mode": "False",
   "invoker":{
     "invoker_folder": "",
     "capif_callback_url": "",
-    "csr_generation":{
+    "cert_generation":{
       "csr_common_name": "",
       "csr_organizational_unit": "",
       "csr_organization": "",
@@ -45,7 +45,7 @@
       "csr_country_name": "ES",
       "csr_email_address": "hola@gmail.com"
     },
-    "apfs": "1",
+    "apfs": "2",
     "aefs": "3",
     "publish_req": {
       "service_api_id": "",
diff --git a/network_app_samples/network_app_provider_sample/nef_upf_vendor_1.json b/network_app_samples/network_app_provider_sample/nef_upf_vendor_1.json
index 38d1f8d..73c0665 100755
--- a/network_app_samples/network_app_provider_sample/nef_upf_vendor_1.json
+++ b/network_app_samples/network_app_provider_sample/nef_upf_vendor_1.json
@@ -2,7 +2,7 @@
     "apiName": "6G-resilience",
     "aefProfiles": [
         {
-            "aefId": "AEFce66355108e807345dc5cf4bc88258",
+            "aefId": "AEFa9977ceac99cd7dca857a373ce4385",
             "versions": [
                 {
                     "apiVersion": "6G_Resilience_v1",
@@ -60,7 +60,7 @@
             ]
         },
         {
-            "aefId": "AEF322d6efae0e509ed0c04c4126fd738",
+            "aefId": "AEF87d2faae1746e7678c959bfe8a513e",
             "versions": [
                 {
                     "apiVersion": "6G_Resilience_v1",
@@ -119,7 +119,7 @@
             ]
         }
     ],
-    "description": "API of dummy netapp to test",
+    "description": "API of dummy Network-App to test",
     "supportedFeatures": "fffff",
     "shareableInfo": {
         "isShareable": true,
diff --git a/network_app_samples/network_app_provider_sample/nef_upf_vendor_2.json b/network_app_samples/network_app_provider_sample/nef_upf_vendor_2.json
index c98178e..09576f3 100755
--- a/network_app_samples/network_app_provider_sample/nef_upf_vendor_2.json
+++ b/network_app_samples/network_app_provider_sample/nef_upf_vendor_2.json
@@ -1,8 +1,8 @@
 {
-    "apiName": "5G-NetApp-API",
+    "apiName": "5G-Network-App-API",
     "aefProfiles": [
         {
-            "aefId": "AEFce66355108e807345dc5cf4bc88258",
+            "aefId": "AEFa9977ceac99cd7dca857a373ce4385",
             "versions": [
                 {
                     "apiVersion": "QoS_v1",
@@ -61,7 +61,7 @@
             ]
         },
         {
-            "aefId": "AEF322d6efae0e509ed0c04c4126fd738",
+            "aefId": "AEF87d2faae1746e7678c959bfe8a513e",
             "versions": [
                 {
                     "apiVersion": "TSN_v1",
@@ -136,7 +136,7 @@
             ]
         },
         {
-            "aefId": "AEFd7ade775c592bc3be4440d1656c084",
+            "aefId": "AEF079fdc40e5d16d3095bac9d268ff12",
             "versions": [
                 {
                     "apiVersion": "NetworkSlicing_v1",
@@ -195,7 +195,7 @@
             ]
         }
     ],
-    "description": "API of dummy netapp to test",
+    "description": "API of dummy Network-App to test",
     "supportedFeatures": "fffff",
     "shareableInfo": {
         "isShareable": true,
diff --git a/network_app_samples/network_app_provider_sample/network_app_provider.py b/network_app_samples/network_app_provider_sample/network_app_provider.py
index a2038d5..c4c0913 100644
--- a/network_app_samples/network_app_provider_sample/network_app_provider.py
+++ b/network_app_samples/network_app_provider_sample/network_app_provider.py
@@ -267,23 +267,30 @@ if __name__ == "__main__":
 
         capif_connector.api_description_path = "./nef_upf_vendor_1.json"
 
-        APF = capif_connector.api_prov_funcs["APF-1"]
+        api6g = capif_connector.api_prov_funcs["APF-1"]
+        api5g = capif_connector.api_prov_funcs["APF-2"]
 
-        AEF1 = capif_connector.api_prov_funcs["AEF-1"]
-        AEF2 = capif_connector.api_prov_funcs["AEF-2"]
-        AEF3 = capif_connector.api_prov_funcs["AEF-3"]
+        Peñuelas = capif_connector.api_prov_funcs["AEF-1"]
+        Distrito = capif_connector.api_prov_funcs["AEF-2"]
+        Valladolid = capif_connector.api_prov_funcs["AEF-3"]
 
-        capif_connector.publish_req['publisher_apf_id'] = APF
-        capif_connector.publish_req['publisher_aefs_ids'] = [AEF1, AEF2]
+        capif_connector.publish_req['publisher_apf_id'] = api6g
+        capif_connector.publish_req['publisher_aefs_ids'] = [Peñuelas, Distrito]
 
         capif_connector.publish_services()
 
         capif_connector.api_description_path = "./nef_upf_vendor_2.json"
 
-        capif_connector.publish_req['publisher_aefs_ids'] = [AEF1, AEF2, AEF3]
+        capif_connector.publish_req['publisher_apf_id'] = api5g
+
+        capif_connector.publish_req['publisher_aefs_ids'] = [Peñuelas, Distrito, Valladolid]
 
         capif_connector.publish_services()
 
+        capif_connector.publish_req['service_api_id'] = capif_connector.published_apis['5G-Network-App-API']
+
+        capif_connector.update_service()
+
         print("APIS PUBLISHED")
 
         config_network()
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..936d205
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,68 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "pesp-capif-sdk"
+version = "0.0.1"
+authors = [
+    { name="JorgeEcheva", email="jorge.echevarriauribarri.practicas@telefonica.com" }
+]
+description = "This repository develops a Python Software Development Kit(SDK) which focuses on connecting to OpenCAPIF (Common API Framework for 3GPP Northbound APIs) in a simple way, lowering integration complexity and allowing developers to focus on Network Applications (Network Apps) or services development."
+readme = "README.md"
+license = { file="LICENSE" }
+requires-python = ">=3.9"
+[project]
+keywords = ["pesp-capif-sdk","capif","sdk capif"]
+dependencies = [
+  "argh==0.31.3",
+  "arrow==1.3.0",
+  "binaryornot==0.4.4",
+  "blinker==1.8.2",
+  "certifi==2024.7.4",
+  "cffi==1.16.0",
+  "chardet==5.2.0",
+  "charset-normalizer==3.3.2",
+  "click==8.1.7",
+  "cookiecutter==2.1.1",
+  "coverage==4.5.4",
+  "cryptography==38.0.4",
+  "flake8==3.9.2",
+  "Flask==3.0.3",
+  "Flask-JWT-Extended==4.6.0",
+  "idna==3.7",
+  "iniconfig==2.0.0",
+  "invoke==1.6.0",
+  "itsdangerous==2.2.0",
+  "Jinja2==3.1.4",
+  "jinja2-time==0.2.0",
+  "MarkupSafe==2.1.5",
+  "mccabe==0.6.1",
+  "packaging==24.1",
+  "pip==24.2",
+  "pluggy==1.5.0",
+  "pycodestyle==2.7.0",
+  "pycparser==2.22",
+  "pyflakes==2.3.1",
+  "PyJWT==2.9.0",
+  "pyOpenSSL==22.1.0",
+  "pytest==8.3.2",
+  "python-dateutil==2.9.0.post0",
+  "python-slugify==8.0.4",
+  "PyYAML==6.0.1",
+  "requests==2.32.3",
+  "six==1.16.0",
+  "text-unidecode==1.3",
+  "types-python-dateutil==2.9.0.20240316",
+  "typing-extensions==3.10.0.2",
+  "urllib3==2.2.2",
+  "Werkzeug==3.0.4"
+]
+
+classifiers = [
+    "Programming Language :: Python :: 3",
+    "Operating System :: OS Independent",
+]
+
+[project.urls]
+"Homepage" = "https://github.com/Telefonica/pesp_capif_sdk"
diff --git a/samples/provider_api_description_sample.json b/samples/provider_api_description_sample.json
index 9bd6154..02d872f 100755
--- a/samples/provider_api_description_sample.json
+++ b/samples/provider_api_description_sample.json
@@ -135,7 +135,7 @@
             ]
         }
     ],
-    "description": "API of dummy netapp to test",
+    "description": "API of dummy Network-App to test",
     "supportedFeatures": "fffff",
     "shareableInfo": {
         "isShareable": true,
diff --git a/sdk/capif_provider_connector.py b/sdk/capif_provider_connector.py
index f1d8640..89e90fd 100644
--- a/sdk/capif_provider_connector.py
+++ b/sdk/capif_provider_connector.py
@@ -145,6 +145,14 @@ class capif_provider_connector:
             self.capif_https_port = str(capif_https_port)
 
             self.api_prov_funcs = {}
+            
+            path_prov_funcs=os.path.join(self.provider_folder,"capif_provider_details.json")
+            if os.path.exists(path_prov_funcs):
+                self.api_prov_funcs=self.__load_provider_api_details()
+            
+            path_published=os.path.join(self.provider_folder,"published_apis.json")
+            if os.path.exists(path_published):
+                self.published_apis=self.__load_config_file(path_published)
 
             # Construct the CAPIF HTTPS URL
             if len(self.capif_https_port) == 0 or int(self.capif_https_port) == 443:
@@ -262,7 +270,7 @@ class capif_provider_connector:
 
         # Build the payload with the non-indexed roles
         payload = {
-            "api_prov_funcs": [
+            "apiProvFuncs": [
                 {"regInfo": {"apiProvPubKey": ""}, "apiProvFuncRole": role,
                     "apiProvFuncInfo": f"{role.lower()}"}
                 for role in roles
@@ -282,13 +290,12 @@ class capif_provider_connector:
             indexedroles.append(f"APF-{n}")
 
         # Save the public keys and generate certificates with indexed roles
-        for i, api_func in enumerate(payload["api_prov_funcs"]):
+        for i, api_func in enumerate(payload["apiProvFuncs"]):
             # Generate public keys with the indexed role, but do not update the payload with the indexed role
             public_key = self.__create_private_and_public_keys(indexedroles[i])
 
             # Assign the public key to the payload
             api_func["regInfo"]["apiProvPubKey"] = public_key.decode("utf-8")
-
         try:
             response = requests.post(
                 url,
@@ -317,7 +324,7 @@ class capif_provider_connector:
             indexedroles.append(f"APF-{n}")
 
         # Save the certificates with the indexed names
-        for i, func_profile in enumerate(onboarding_response["api_prov_funcs"]):
+        for i, func_profile in enumerate(onboarding_response["apiProvFuncs"]):
             role = indexedroles[i].lower()
             cert_path = os.path.join(self.provider_folder, f"{role}.crt")
             with open(cert_path, "wb") as cert_file:
@@ -332,9 +339,9 @@ class capif_provider_connector:
                 "capif_registration_id": capif_registration_id,
                 "publish_url": publish_url,
                 **{f"{indexedroles[i]}": api_prov_func["apiProvFuncId"]
-                   for i, api_prov_func in enumerate(onboarding_response["api_prov_funcs"])}
+                   for i, api_prov_func in enumerate(onboarding_response["apiProvFuncs"])}
             }
-            for i, api_prov_func in enumerate(onboarding_response["api_prov_funcs"]):
+            for i, api_prov_func in enumerate(onboarding_response["apiProvFuncs"]):
                 self.api_prov_funcs[indexedroles[i]] = api_prov_func["apiProvFuncId"]
             json.dump(data, outfile, indent=4)
 
@@ -510,7 +517,7 @@ class capif_provider_connector:
                 outfile.write(capif_response_text)
             self.logger.info(f"CAPIF response saved to {output_path}")
             output_path = os.path.join(
-                self.provider_folder, "published-apis.json")
+                self.provider_folder, "published_apis.json")
 
             # Read the existing file of published APIs
             published_apis = {}
@@ -522,6 +529,7 @@ class capif_provider_connector:
 
             published_apis[file_name] = id
 
+            self.published_apis = published_apis
             # Write the updated file of published APIs
             with open(output_path, "w") as outfile:
                 json.dump(published_apis, outfile, indent=4)
@@ -611,7 +619,7 @@ class capif_provider_connector:
                     break
 
             output_path = os.path.join(
-                self.provider_folder, "published-apis.json")
+                self.provider_folder, "published_apis.json")
 
             # Read the existing file of published APIs
             published_apis = {}
@@ -641,7 +649,7 @@ class capif_provider_connector:
             # Write the updated file of published APIs
             with open(output_path, "w") as outfile:
                 json.dump(published_apis, outfile, indent=4)
-
+            self.published_apis = published_apis
             self.logger.info("Services unpublished successfully")
 
         except requests.RequestException as e:
@@ -928,7 +936,7 @@ class capif_provider_connector:
                 outfile.write(capif_response_text)
             self.logger.info(f"CAPIF response saved to {output_path}")
             output_path = os.path.join(
-                self.provider_folder, "published-apis.json")
+                self.provider_folder, "published_apis.json")
 
             # Read the existing file of published APIs
             published_apis = {}
@@ -942,7 +950,7 @@ class capif_provider_connector:
                 del published_apis[key]
             # Add the new id of the published API
             published_apis[file_name] = id
-
+            self.published_apis = published_apis
             # Update the file with the published APIs
             with open(output_path, "w") as outfile:
                 json.dump(published_apis, outfile, indent=4)
@@ -1181,7 +1189,7 @@ class capif_provider_connector:
 
         # Build the payload with unindexed roles
         payload = {
-            "api_prov_funcs": [
+            "apiProvFuncs": [
                 {"regInfo": {"apiProvPubKey": ""}, "apiProvFuncRole": role,
                     "apiProvFuncInfo": f"{role.lower()}"}
                 for role in roles
@@ -1197,7 +1205,7 @@ class capif_provider_connector:
             f"APF-{n}" for n in range(1, self.apfs + 1)]
 
         # Iterate over each API provider function
-        for i, api_func in enumerate(payload["api_prov_funcs"]):
+        for i, api_func in enumerate(payload["apiProvFuncs"]):
             # Folder path for providers
             folder_path = self.provider_folder
 
diff --git a/sdk/service_discoverer.py b/sdk/service_discoverer.py
index 1df24cc..0dacba1 100644
--- a/sdk/service_discoverer.py
+++ b/sdk/service_discoverer.py
@@ -101,6 +101,7 @@ class service_discoverer:
         self.capif_invoker_username = capif_invoker_username
         self.capif_host = capif_host
         self.capif_https_port = capif_https_port
+        self.token = ""
 
         # Create invoker folder dynamically based on username and folder path
         self.invoker_folder = os.path.join(invoker_general_folder, capif_invoker_username)
@@ -108,6 +109,10 @@ class service_discoverer:
 
         # Load CAPIF API details
         self.capif_api_details = self.__load_provider_api_details()
+        try:
+            self.token = self.capif_api_details["access_token"]
+        except :
+            pass
 
         # Define paths for certificates, private keys, and CA root
         self.signed_key_crt_path = os.path.join(self.invoker_folder, self.capif_api_details["user_name"] + ".crt")
@@ -440,6 +445,7 @@ class service_discoverer:
 
         self.get_security_context()
         token = self.get_access_token()
+        self.token = token
         self.save_security_token(token)
 
     def discover(self):
diff --git a/test/capif_sdk_config_sample_test.json b/test/capif_sdk_config_sample_test.json
index e8d60d0..2bf2a12 100644
--- a/test/capif_sdk_config_sample_test.json
+++ b/test/capif_sdk_config_sample_test.json
@@ -1,22 +1,23 @@
 {
-  "capif_host": "capif-prev.mobilesandbox.cloud",
-  "register_host": "registercapif-prev.mobilesandbox.cloud",
-  "capif_https_port": "36212",
-  "capif_register_port": "36211",
-  "capif_username": "echeva_0",
-  "capif_password": "echevapass",
-  "debug_mode": "False",
-  "invoker":{
-    "invoker_folder": "/Users/IDB0128/Documents/OpenCapif/test_invoker_certificate_folder",
-    "capif_callback_url": "http://localhost:5000",
-    "cert_generation":{
-      "csr_common_name": "invoker",
-      "csr_organizational_unit": "test_app_ou",
-      "csr_organization": "test_app_o",
-      "crs_locality": "Madrid",
-      "csr_state_or_province_name": "Madrid",
-      "csr_country_name": "ES",
-      "csr_email_address": "test@example.com"
+
+  "capif_host": "",
+  "register_host": "",
+  "capif_https_port": "",
+  "capif_register_port": "",
+  "capif_username": "",
+  "capif_password": "",
+  "debug_mode": "",
+  "invoker": {
+    "invoker_folder": "",
+    "capif_callback_url": "",
+    "cert_generation": {
+      "csr_common_name": "",
+      "csr_organizational_unit": "",
+      "csr_organization": "",
+      "crs_locality": "",
+      "csr_state_or_province_name": "",
+      "csr_country_name": "",
+      "csr_email_address": ""
     },
     "discover_filter": {
       "api-name": "",
@@ -34,27 +35,27 @@
       "service-kpis": ""
     }
   },
-  "provider":{
-    "provider_folder": "/Users/IDB0128/Documents/OpenCapif/test_provider_certificate_folder",
+  "provider": {
+    "provider_folder": "",
     "apfs": "1",
     "aefs": "3",
     "publish_req": {
-      "service_api_id": "80dbdd52ee766d4ad4494264e4289c",
-      "publisher_apf_id": "APF73e3458fb483c3c65f2f7e126ec851",
+      "service_api_id": "",
+      "publisher_apf_id": "",
       "publisher_aefs_ids": [
-        "AEF07a01ccd74a160c195e69b4f116d66",
-        "AEFb5c206b46fc68c192aed6870899ea1"
+        "",
+        ""
       ]
     },
-    "cert_generation":{
-      "csr_common_name": "provider",
-      "csr_organizational_unit": "test_app_ou",
-      "csr_organization": "test_app_o",
-      "crs_locality": "Madrid",
-      "csr_state_or_province_name": "Madrid",
-      "csr_country_name": "ES",
-      "csr_email_address": "test@example.com"
+    "cert_generation": {
+      "csr_common_name": "",
+      "csr_organizational_unit": "",
+      "csr_organization": "",
+      "crs_locality": "",
+      "csr_state_or_province_name": "",
+      "csr_country_name": "",
+      "csr_email_address": ""
     },
-    "api_description_path": "./network_app_provider_api_spec.json"
+    "api_description_path": ""
   }
 }
diff --git a/test/network_app_provider_api_spec.json b/test/network_app_provider_api_spec.json
index 163612b..b17a336 100755
--- a/test/network_app_provider_api_spec.json
+++ b/test/network_app_provider_api_spec.json
@@ -136,7 +136,7 @@
             ]
         }
     ],
-    "description": "API of dummy netapp to test",
+    "description": "API of dummy Network-App to test",
     "supportedFeatures": "fffff",
     "shareableInfo": {
         "isShareable": true,
diff --git a/test/network_app_provider_api_spec_2.json b/test/network_app_provider_api_spec_2.json
index 6ed5275..c205b63 100755
--- a/test/network_app_provider_api_spec_2.json
+++ b/test/network_app_provider_api_spec_2.json
@@ -195,7 +195,7 @@
             ]
         }
     ],
-    "description": "API of dummy netapp to test",
+    "description": "API of dummy Network-App to test",
     "supportedFeatures": "fffff",
     "shareableInfo": {
         "isShareable": true,
diff --git a/test/network_app_provider_api_spec_3.json b/test/network_app_provider_api_spec_3.json
index 083a06e..07b7927 100755
--- a/test/network_app_provider_api_spec_3.json
+++ b/test/network_app_provider_api_spec_3.json
@@ -136,7 +136,7 @@
             ]
         }
     ],
-    "description": "API of dummy netapp to test",
+    "description": "API of dummy Network-App to test",
     "supportedFeatures": "fffff",
     "shareableInfo": {
         "isShareable": true,
diff --git a/test/test.py b/test/test.py
index a769394..c22138e 100644
--- a/test/test.py
+++ b/test/test.py
@@ -83,7 +83,7 @@ def ensure_update(Chosen_apf, Chosen_aefs, second_network_app_api,capif_provider
 
     print("PROVIDER PUBLISH COMPLETED")
 
-    PublishedApis = os.path.join(provider_folder,"published-Apis.json")
+    PublishedApis = os.path.join(provider_folder,"published_apis.json")
     if not os.path.exists(PublishedApis):
         raise FileNotFoundError(f"File {PublishedApis} not found")
 
@@ -146,7 +146,7 @@ if __name__ == "__main__":
 
         print("PROVIDER PUBLISH COMPLETED")
 
-        PublishedApis = os.path.join(provider_folder,"published-Apis.json")
+        PublishedApis = os.path.join(provider_folder,"published_apis.json")
         
         with open(PublishedApis, 'r') as file:
             PublishedApis = json.load(file)
-- 
GitLab