[Beta]{class="badge informative"}

Skapa en källanslutning och ett dataflöde för Oracle NetSuite Activities med API:t för Flow Service

NOTE
Källan Oracle NetSuite Activities är i betaversion. Mer information om hur du använder betatecknade källor finns i källöversikten.

Läs följande självstudiekurs om du vill veta mer om hur du överför händelsedata från ditt Oracle NetSuite Activities-konto till Adobe Experience Platform med Flow Service API.

Komma igång

Handboken kräver en fungerande förståelse av följande komponenter i Experience Platform:

  • Källor: Experience Platform tillåter data att hämtas från olika källor samtidigt som du kan strukturera, etikettera och förbättra inkommande data med hjälp av plattformstjänster.
  • Sandlådor: Experience Platform tillhandahåller virtuella sandlådor som partitionerar en enda plattformsinstans till separata virtuella miljöer för att utveckla och utveckla program för digitala upplevelser.

I följande avsnitt finns ytterligare information som du behöver känna till för att kunna ansluta till Oracle NetSuite Activities med API:t Flow Service.

Autentisering

Läs Oracle NetSuite översikten om du vill ha mer information om hur du hämtar autentiseringsuppgifter.

Använda plattforms-API:er

Mer information om hur du kan anropa plattforms-API:er finns i guiden Komma igång med plattforms-API:er.

Anslut Oracle NetSuite Activities till plattformen med API:t Flow Service

Följ instruktionerna nedan för att lära dig hur du autentiserar din Oracle NetSuite Activities-källa, skapar en källanslutning och skapar ett dataflöde som skickar dina händelsedata till Experience Platform.

Skapa en basanslutning base-connection

En basanslutning bevarar information mellan källan och Experience Platform, inklusive källans autentiseringsuppgifter, anslutningens aktuella tillstånd och ditt unika basanslutnings-ID. Med det grundläggande anslutnings-ID:t kan du utforska och navigera bland filer inifrån källan och identifiera de specifika objekt som du vill importera, inklusive information om deras datatyper och format.

Om du vill skapa ett grundläggande anslutnings-ID skickar du en POST till /connections-slutpunkten och anger dina Oracle NetSuite Activities autentiseringsuppgifter som en del av begärandetexten.

API-format

POST /connections

Begäran

Följande begäran skapar en basanslutning för Oracle NetSuite Activities:

curl -X POST \
  'https://platform.adobe.io/data/foundation/flowservice/connections' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'x-api-key: {API_KEY}' \
  -H 'x-gw-ims-org-id: {ORG_ID}' \
  -H 'x-sandbox-name: {SANDBOX_NAME}' \
  -H 'Content-Type: application/json' \
  -d '{
      "name": "Oracle NeSuite Activities base connection",
      "description": "Authenticated base connection for Oracle NetSuite Activities",
      "connectionSpec": {
          "id": "fdf850b4-5a8d-4a5a-9ce8-4caef9abb2a8",
          "version": "1.0"
      },
      "auth": {
          "specName": "OAuth2 Client Credential",
          "params": {
              "clientId": "{CLIENT_ID}",
              "clientSecret": "{CLIENT_SECRET}"
              "accessTokenUrl": "{ACCESS_TOKEN_URL}",
              "accessToken": "{ACCESS_TOKEN_URL}"
          }
      }
  }'
Egenskap
Beskrivning
name
Namnet på din basanslutning. Kontrollera att namnet på din basanslutning är beskrivande, eftersom du kan använda detta för att söka efter information om din basanslutning.
description
Ett valfritt värde som du kan ta med för att ange mer information om din basanslutning.
connectionSpec.id
Anslutningsspecifikations-ID för källan. Detta ID kan hämtas när källan har registrerats och godkänts via API:t Flow Service.
auth.specName
Autentiseringstypen som du använder för att autentisera källan till plattformen.
auth.params.clientId
Klient-ID-värdet när du skapar integreringsposten. Processen för att skapa en interaktionspost finns här. Värdet är en sträng med 64 tecken som liknar 7fce.....b42f.
auth.params.clientSecret
Klient-ID-värdet när du skapar integreringsposten. Processen för att skapa en interaktionspost finns här. Värdet är en sträng med 64 tecken som liknar 5c98.....1b46.
auth.params.accessTokenUrl
Åtkomsttoken-URL:en NetSuite, som liknar https://{ACCOUNT_ID}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token, där du ersätter ACCOUNT_ID med ditt NetSuite konto-ID.
auth.params.accessToken
Åtkomsttokenvärdet genereras i slutet av steg två i självstudiekursen OAuth 2.0 Authorization Code Grant Flow. Åtkomsttoken som förfaller gäller endast i 60 minuter. värdet är en 1024-teckensträng formaterad som en JSON Web Token (JWT) som liknar eyJr......f4V0.

Svar

Ett svar returnerar den nyskapade basanslutningen, inklusive dess unika anslutnings-ID (id). Detta ID krävs för att undersöka källans filstruktur och innehåll i nästa steg.

{
    "id": "60c81023-99b4-4aae-9c31-472397576dd2",
    "etag": "\"fa003785-0000-0200-0000-6555c5310000\""
}

Utforska din källa explore

När du har ditt basanslutnings-ID kan du nu utforska innehållet och strukturen i dina källdata genom att utföra en GET-förfrågan till /connections-slutpunkten och samtidigt ange ditt grundläggande anslutnings-ID som en frågeparameter.

API-format

GET /connections/{BASE_CONNECTION_ID}/explore?objectType=rest&object={OBJECT}&fileType={FILE_TYPE}&preview={PREVIEW}&sourceParams={SOURCE_PARAMS}

Begäran

När du gör en GET-förfrågan om att utforska källans filstruktur och innehåll måste du inkludera frågeparametrarna som listas i tabellen nedan:

Parameter
Beskrivning
{BASE_CONNECTION_ID}
Det grundläggande anslutnings-ID som genererades i föregående steg.
objectType=rest
Den typ av objekt som du vill utforska. För närvarande är det här värdet alltid inställt på rest.
{OBJECT}
Den här parametern krävs bara när du visar en viss katalog. Dess värde representerar sökvägen till den katalog du vill utforska. För den här källan är värdet json.
fileType=json
Filtypen för filen som du vill hämta till plattformen. För närvarande är json den enda filtypen som stöds.
{PREVIEW}
Ett booleskt värde som definierar om innehållet i anslutningen stöder förhandsvisning.
{SOURCE_PARAMS}
Definierar parametrar för källfilen som du vill hämta till plattformen. Om du vill hämta den godkända formattypen för {SOURCE_PARAMS} måste du koda hela strängen i base64.
Värdet är tomt för Oracle NetSuite Activities.
curl -X GET \
  'https://platform.adobe.io/data/foundation/flowservice/connections/f5421911-6f6c-41c7-aafa-5d9d2ce51535/explore?objectType=rest&object=json&fileType=json&preview=true&sourceParams=e30%3D' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'x-api-key: {API_KEY}' \
  -H 'x-gw-ims-org-id: {ORG_ID}' \
  -H 'x-sandbox-name: {SANDBOX_NAME}'

Svar

Ett lyckat svar returnerar en JSON-struktur som följande:

Välj för att visa JSON-nyttolasten
code language-json
{
    "format": "hierarchical",
    "schema": {
        "type": "object",
        "properties": {
            "totalResults": {
                "type": "integer",
                "minimum": -9007199254740992,
                "maximum": 9007199254740991
            },
            "offset": {
                "type": "integer",
                "minimum": -9007199254740992,
                "maximum": 9007199254740991
            },
            "count": {
                "type": "integer",
                "minimum": -9007199254740992,
                "maximum": 9007199254740991
            },
            "hasMore": {
                "type": "boolean"
            },
            "links": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "rel": {
                            "type": "string"
                        },
                        "href": {
                            "type": "string"
                        }
                    }
                }
            },
            "items": {
                "type": "object",
                "properties": {
                    "owner": {
                        "type": "string"
                    },
                    "createddate": {
                        "type": "string"
                    },
                    "lastmodifieddate": {
                        "type": "string"
                    },
                    "accesslevel": {
                        "type": "string"
                    },
                    "alldayevent": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    },
                    "startdate": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "organizer": {
                        "type": "string"
                    },
                    "response": {
                        "type": "string"
                    },
                    "links": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {}
                        }
                    },
                    "location": {
                        "type": "string"
                    },
                    "timedevent": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    }
                }
            }
        }
    },
    "data": [
        {
            "totalResults": 13,
            "offset": 0,
            "count": 13,
            "hasMore": false,
            "links": [
                {
                    "rel": "self",
                    "href": "https://{ACCOUNT_ID}.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql"
                }
            ],
            "items": {
                "accesslevel": "BUSY",
                "alldayevent": "F",
                "createddate": "2022-12-15",
                "id": "5",
                "lastmodifieddate": "2022-12-15",
                "location": "Caffe West",
                "message": "Bring Monthly Results",
                "organizer": "-5",
                "owner": "-5",
                "response": "ACCEPTED",
                "startdate": "2022-12-15",
                "status": "CONFIRMED",
                "timedevent": "T",
                "title": "Meeting with Tom"
            }
        },
        {
            "totalResults": 13,
            "offset": 0,
            "count": 13,
            "hasMore": false,
            "links": [
                {
                    "rel": "self",
                    "href": "https://{ACCOUNT_ID}.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql"
                }
            ],
            "items": {
                "accesslevel": "BUSY",
                "alldayevent": "F",
                "createddate": "2023-02-01",
                "id": "103",
                "lastmodifieddate": "2023-02-01",
                "location": "Caffe West",
                "message": "Bring Monthly Results",
                "organizer": "-5",
                "owner": "-5",
                "response": "ACCEPTED",
                "startdate": "2022-12-15",
                "status": "CONFIRMED",
                "timedevent": "T",
                "title": "Meeting with Tom"
            }
        },
        {
            "totalResults": 13,
            "offset": 0,
            "count": 13,
            "hasMore": false,
            "links": [
                {
                    "rel": "self",
                    "href": "https://{ACCOUNT_ID}.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql"
                }
            ],
            "items": {
                "accesslevel": "BUSY",
                "alldayevent": "F",
                "createddate": "2023-11-09",
                "id": "204",
                "lastmodifieddate": "2023-11-09",
                "location": "Caffe West",
                "message": "Bring Monthly Results",
                "organizer": "-5",
                "owner": "-5",
                "response": "ACCEPTED",
                "startdate": "2023-12-15",
                "status": "CONFIRMED",
                "timedevent": "T",
                "title": "Meeting with Tom"
            }
        },
    ]
}

Skapa en källanslutning source-connection

Du kan skapa en källanslutning genom att göra en POST-förfrågan till /sourceConnections-slutpunkten i Flow Service API:t. En källanslutning består av ett anslutnings-ID, en sökväg till källdatafilen och ett anslutnings-spec-ID.

API-format

POST /sourceConnections

Begäran

Följande begäran skapar en källanslutning för Oracle NetSuite Activities.

curl -X POST \
  'https://platform.adobe.io/data/foundation/flowservice/sourceConnections' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'x-api-key: {API_KEY}' \
  -H 'x-gw-ims-org-id: {ORG_ID}' \
  -H 'x-sandbox-name: {SANDBOX_NAME}' \
  -H 'Content-Type: application/json' \
  -d '{
      "name": "Oracle NetSuite Activities Source Connection",
      "description": "Oracle NetSuite Activities Source Connection",
      "baseConnectionId": "60c81023-99b4-4aae-9c31-472397576dd2",
      "connectionSpec": {
          "id": "fdf850b4-5a8d-4a5a-9ce8-4caef9abb2a8",
          "version": "1.0"
      },
      "data": {
          "format": "json"
      },
      "params": {
      }
  }'
Egenskap
Beskrivning
name
Namnet på källanslutningen. Kontrollera att namnet på källanslutningen är beskrivande, eftersom du kan använda det här för att söka efter information om källanslutningen.
description
Ett valfritt värde som du kan ta med för att ange mer information om din källanslutning.
baseConnectionId
Basanslutnings-ID för Oracle NetSuite Activities. Detta ID genererades i ett tidigare steg.
connectionSpec.id
Anslutningsspecifikations-ID som motsvarar källan.
data.format
Formatet på de Oracle NetSuite Activities-data som du vill importera. För närvarande är det enda dataformat som stöds json.

Ett lyckat svar returnerar den unika identifieraren (id) för den nyligen skapade källanslutningen. Detta ID krävs i ett senare steg för att skapa ett dataflöde.

{
    "id": "574c049f-29fc-411f-be0d-f80002025f51",
    "etag": "\"0704acb3-0000-0200-0000-6555c5470000\""
}

Skapa ett mål-XDM-schema target-schema

För att källdata ska kunna användas i Platform måste ett målschema skapas för att strukturera källdata efter dina behov. Målschemat används sedan för att skapa en plattformsdatauppsättning där källdata finns.

Ett mål-XDM-schema kan skapas genom att utföra en POST-begäran till schemats register-API.

Detaljerade steg om hur du skapar ett mål-XDM-schema finns i självstudiekursen Skapa ett schema med API:t.

Skapa en måldatauppsättning target-dataset

En måldatamängd kan skapas genom att utföra en POST-begäran till katalogtjänstens API, som anger målschemats ID i nyttolasten.

Detaljerade steg om hur du skapar en måldatauppsättning finns i självstudiekursen Skapa en datauppsättning med API:t.

Skapa en målanslutning target-connection

En målanslutning representerar anslutningen till målet där inmatade data ska lagras. Om du vill skapa en målanslutning måste du ange det fasta anslutnings-spec-ID som motsvarar datasjön. Detta ID är: c604ff05-7f1a-43c0-8e18-33bf874cb11c.

Nu har du de unika identifierarna ett målschema, en måldatamängd och ett anslutningsspec-ID till datasjön. Med hjälp av dessa identifierare kan du skapa en målanslutning med API:t Flow Service för att ange den datauppsättning som ska innehålla inkommande källdata.

API-format

POST /targetConnections

Begäran

Följande begäran skapar en målanslutning för Oracle NetSuite Activities:

curl -X POST \
  'https://platform.adobe.io/data/foundation/flowservice/targetConnections' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'x-api-key: {API_KEY}' \
  -H 'x-gw-ims-org-id: {ORG_ID}' \
  -H 'x-sandbox-name: {SANDBOX_NAME}' \
  -H 'Content-Type: application/json' \
  -d '{
      "name": "Oracle NetSuite Activities Target Connection Generic Rest",
      "description": "Oracle NetSuite Activities Target Connection Generic Rest",
      "connectionSpec": {
          "id": "c604ff05-7f1a-43c0-8e18-33bf874cb11c",
          "version": "1.0"
      },
      "data": {
          "format": "parquet_xdm",
          "schema": {
              "id": "https://ns.adobe.com/{TENANT_ID}/schemas/325fd5394ba421246b05c0a3c2cd5efeec2131058a63d473",
              "version": "1.2"
          }
      },
      "params": {
          "dataSetId": "65004470082ac828d2c3d6a0"
      }
  }'
Egenskap
Beskrivning
name
Namnet på målanslutningen. Kontrollera att namnet på målanslutningen är beskrivande, eftersom du kan använda det här för att söka efter information om målanslutningen.
description
Ett valfritt värde som du kan inkludera för att ange mer information om målanslutningen.
connectionSpec.id
Anslutningsspecifikations-ID som motsvarar datasjön. Detta fasta ID är: 6b137bf6-d2a0-48c8-914b-d50f4942eb85.
data.format
Formatet på de Oracle NetSuite Activities-data som du vill importera.
params.dataSetId
Måldatauppsättnings-ID som hämtades i ett tidigare steg.

Svar

Ett svar returnerar den nya målanslutningens unika identifierare (id). Detta ID krävs i senare steg.

{
    "id": "382fc614-3c5b-46b9-a971-786fb0ae6c5d",
    "etag": "\"e0016100-0000-0200-0000-655707a40000\""
}

Skapa en mappning mapping

För att källdata ska kunna hämtas till en måldatamängd måste den först mappas till målschemat som måldatamängden följer. Detta uppnås genom att utföra en begäran om POST till Data Prep API med datamappningar definierade i nyttolasten för begäran.

API-format

POST /conversion/mappingSets

Begäran

I följande begäran skapas en mappning för DNL NetSuite Activities

curl -X POST \
  'https://platform.adobe.io/data/foundation/conversion/mappingSets' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'x-api-key: {API_KEY}' \
  -H 'x-gw-ims-org-id: {ORG_ID}' \
  -H 'x-sandbox-name: {SANDBOX_NAME}' \
  -H 'Content-Type: application/json' \
  -d '{
      "outputSchema": {
          "schemaRef": {
              "id": "https://ns.adobe.com/{TENANT_ID}/schemas/b156e6f818f923e048199173c45e55e20fd2487f5eb03d22",
              "contentType": "application/vnd.adobe.xed-full+json;version=1"
          }
      },
      "mappings": [
        {
            "sourceType": "ATTRIBUTE",
            "source": "items.id",
            "destination": "_extconndev.NSA_ID"
        },
        {
            "sourceType": "ATTRIBUTE",
            "source": "items.title",
            "destination": "_extconndev.NSA_title"
        },
        {
            "sourceType": "ATTRIBUTE",
            "source": "items.createddate",
            "destination": "_extconndev.NSA_createddate"
        },
        {
            "sourceType": "ATTRIBUTE",
            "source": "items.location",
            "destination": "_extconndev.NSA_location"
        },
        {
            "sourceType": "ATTRIBUTE",
            "source": "items.lastmodifieddate",
            "destination": "_extconndev.NSA_lastmodifieddate"
        }
      ],
    "outputSchema": {
        "schemaRef": {
            "id": "https://ns.adobe.com/{TENANT_ID}/schemas/325fd5394ba421246b05c0a3c2cd5efeec2131058a63d473",
            "contentType": "application/vnd.adobe.xed-full+json;version=1"
        }
    }
  }'
Egenskap
Beskrivning
outputSchema.schemaRef.id
ID:t för mål-XDM-schemat genererades i ett tidigare steg.
mappings.sourceType
Källattributtypen som mappas.
mappings.source
Källattributet som måste mappas till en mål-XDM-sökväg.
mappings.destination
Mål-XDM-sökvägen dit källattributet mappas.

Svar

Ett lyckat svar returnerar information om den nyligen skapade mappningen inklusive dess unika identifierare (id). Detta värde krävs i ett senare steg för att skapa ett dataflöde.

{
    "id": "ddf0592bcc9d4ac391803f15f2429f87",
    "version": 0,
    "createdDate": 1597784069368,
    "modifiedDate": 1597784069368,
    "createdBy": "{CREATED_BY}",
    "modifiedBy": "{MODIFIED_BY}"
}

Skapa ett flöde flow

Det sista steget mot att överföra data från Oracle NetSuite Activities till plattformen är att skapa ett dataflöde. Nu har du förberett följande obligatoriska värden:

Ett dataflöde ansvarar för att schemalägga och samla in data från en källa. Du kan skapa ett dataflöde genom att utföra en begäran om POST samtidigt som du anger de tidigare angivna värdena i nyttolasten.

API-format

POST /flows

Begäran

curl -X POST \
  'https://platform.adobe.io/data/foundation/flowservice/flows' \
  -H 'x-api-key: {API_KEY}' \
  -H 'x-gw-ims-org-id: {ORG_ID}' \
  -H 'x-sandbox-name: {SANDBOX_NAME}' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Oracle NetSuite Activities connector Flow Generic Rest",
    "description": "Oracle NetSuite Activities connector Description Flow Generic Rest",
    "flowSpec": {
        "id": "6499120c-0b15-42dc-936e-847ea3c24d72",
        "version": "1.0"
    },
    "sourceConnectionIds": [
        "d8827440-339f-428d-bf38-5e2ab1f0f7bb"
    ],
    "targetConnectionIds": [
        "e349a15e-c639-4047-8b2a-154aa7a857d7"
    ],
    "transformations": [
        {
            "name": "Mapping",
            "params": {
                "mappingId": "10787532e0994eb686e76bdab69a9e88",
                "mappingVersion": 0
            }
        }
    ],
      "scheduleParams": {
          "startTime": 1700202649,
          "frequency": "once"
      }
  }'
Egenskap
Beskrivning
name
Namnet på dataflödet. Kontrollera att namnet på dataflödet är beskrivande, eftersom du kan använda det för att söka efter information om dataflödet.
description
Ett valfritt värde som du kan inkludera för att få mer information om dataflödet.
flowSpec.id
Det ID för flödesspecifikation som krävs för att skapa ett dataflöde. Detta fasta ID är: 6499120c-0b15-42dc-936e-847ea3c24d72.
flowSpec.version
Motsvarande version av flödesspecifikations-ID. Standardvärdet är 1.0.
sourceConnectionIds
källanslutnings-ID genererades i ett tidigare steg.
targetConnectionIds
målanslutnings-ID genererades i ett tidigare steg.
transformations
Den här egenskapen innehåller de olika omformningar som behövs för att dina data ska kunna användas. Den här egenskapen krävs när data som inte är XDM-kompatibla skickas till plattformen.
transformations.name
Det namn som tilldelats omformningen.
transformations.params.mappingId
Mappnings-ID genererades i ett tidigare steg.
transformations.params.mappingVersion
Motsvarande version av mappnings-ID. Standardvärdet är 0.
scheduleParams.startTime
Den här egenskapen innehåller information om dataflödets ingsplanering.
scheduleParams.frequency
Frekvensen med vilken dataflödet samlar in data.
scheduleParams.interval
Intervallet anger perioden mellan två på varandra följande flödeskörningar. Intervallets värde ska vara ett heltal som inte är noll.

Svar

Ett lyckat svar returnerar ID:t (id) för det nyskapade dataflödet. Du kan använda det här ID:t för att övervaka, uppdatera eller ta bort dataflödet.

{
     "id": "84c64142-1741-4b0b-95a9-65644eba0cf6",
     "etag": "\"3901770b-0000-0200-0000-655708970000\""
}

Bilaga

Följande avsnitt innehåller information om hur du övervakar, uppdaterar och tar bort dataflödet.

Övervaka dataflödet

När dataflödet har skapats kan du övervaka de data som importeras genom det för att se information om flödeskörningar, slutförandestatus och fel. Fullständiga API-exempel finns i handboken om att övervaka källans dataflöden med API:t.

Uppdatera ditt dataflöde

Uppdatera informationen om dataflödet, till exempel namn och beskrivning, samt körningsschema och associerade mappningsuppsättningar genom att göra en PATCH-begäran till /flows-slutpunkten i Flow Service-API:t, samtidigt som du anger ID:t för dataflödet. När du gör en PATCH-begäran måste du ange dataflödets unika etag i rubriken If-Match. Fullständiga API-exempel finns i guiden om att uppdatera källkodsdataflöden med API:t.

Uppdatera ditt konto

Uppdatera namn, beskrivning och autentiseringsuppgifter för källkontot genom att utföra en PATCH-begäran till Flow Service-API:t och ange ditt grundläggande anslutnings-ID som en frågeparameter. När du gör en PATCH-begäran måste du ange källkontots unika etag i rubriken If-Match. Fullständiga API-exempel finns i handboken Uppdatera ditt källkonto med API.

Ta bort ditt dataflöde

Ta bort dataflödet genom att utföra en DELETE-begäran till Flow Service-API:t och ange ID:t för det dataflöde som du vill ta bort som en del av frågeparametern. Fullständiga API-exempel finns i guiden om att ta bort dataflöden med API:t.

Ta bort ditt konto

Ta bort ditt konto genom att utföra en DELETE-begäran till Flow Service-API:t och ange det grundläggande anslutnings-ID:t för kontot som du vill ta bort. Fullständiga API-exempel finns i guiden om att ta bort ditt källkonto med API.

recommendation-more-help
337b99bb-92fb-42ae-b6b7-c7042161d089