fix: add token link help

This commit is contained in:
Maël Gangloff
2025-02-19 00:54:04 +01:00
parent 34ea4dd37c
commit 27e60e566a
7 changed files with 110 additions and 74 deletions

View File

@@ -29,14 +29,12 @@ export default function AutoDnsConnectorForm({form, onCreate}: {
style={{marginBottom: '2em'}} style={{marginBottom: '2em'}}
/> />
<br/>
<Form.Item <Form.Item
label={t`AutoDNS Username`} label={t`AutoDNS Username`}
name={['authData', 'username']} name={['authData', 'username']}
help={<Typography.Text help={<Typography.Link target='_blank' href='https://en.autodns.com/domain-robot-api/'>
type='secondary' {t`Because of some limitations in API of AutoDNS, we suggest to create an dedicated user for API with limited rights`}
>{t`Attention: AutoDNS do not support 2-Factor Authentication on API Users for automated systems`} </Typography.Link>}
</Typography.Text>}
rules={[{required: true, message: t`Required`}]} rules={[{required: true, message: t`Required`}]}
> >
<Input autoComplete='off' required/> <Input autoComplete='off' required/>
@@ -44,6 +42,10 @@ export default function AutoDnsConnectorForm({form, onCreate}: {
<Form.Item <Form.Item
label={t`AutoDNS Password`} label={t`AutoDNS Password`}
name={['authData', 'password']} name={['authData', 'password']}
help={<Typography.Text
type='secondary'
>{t`Attention: AutoDNS do not support 2-Factor Authentication on API Users for automated systems`}
</Typography.Text>}
rules={[{required: true, message: t`Required`}]} rules={[{required: true, message: t`Required`}]}
required required
> >
@@ -54,7 +56,7 @@ export default function AutoDnsConnectorForm({form, onCreate}: {
name={['authData', 'contactid']} name={['authData', 'contactid']}
help={<Typography.Text help={<Typography.Text
type='secondary' type='secondary'
>{t`The nic-handle of the domain name owner`}<a >{t`The nic-handle of the domain name owner`} <a
href='https://cloud.autodns.com/contacts/domain' href='https://cloud.autodns.com/contacts/domain'
>{t`You can get it from this page`} >{t`You can get it from this page`}
</a> </a>

View File

@@ -26,6 +26,9 @@ export default function GandiConnectorForm({form, onCreate}: {
<Form.Item <Form.Item
label={t`Personal Access Token (PAT)`} label={t`Personal Access Token (PAT)`}
name={['authData', 'token']} name={['authData', 'token']}
help={<Typography.Link target='_blank' href='https://admin.gandi.net/organizations/account/pat'>
{t`Retrieve a Personal Access Token from your customer account on the Provider's website`}
</Typography.Link>}
rules={[{required: true, message: t`Required`}]} rules={[{required: true, message: t`Required`}]}
> >
<Input autoComplete='off'/> <Input autoComplete='off'/>

View File

@@ -1,5 +1,5 @@
import type {FormInstance} from 'antd' import type {FormInstance} from 'antd'
import {Form, Input} from 'antd' import {Form, Input, Typography} from 'antd'
import React from 'react' import React from 'react'
import type {Connector} from '../../api/connectors' import type {Connector} from '../../api/connectors'
import {ConnectorProvider} from '../../api/connectors' import {ConnectorProvider} from '../../api/connectors'
@@ -27,6 +27,9 @@ export default function NamecheapConnectorForm({form, onCreate}: {
<Form.Item <Form.Item
label={t`Username`} label={t`Username`}
name={['authData', 'ApiUser']} name={['authData', 'ApiUser']}
help={<Typography.Link target='_blank' href='https://ap.www.namecheap.com/settings/tools/apiaccess/'>
{t`Retreive an API key and whitelist this instance's IP address on Namecheap's website`}
</Typography.Link>}
> >
<Input autoComplete='off'/> <Input autoComplete='off'/>
</Form.Item> </Form.Item>

View File

@@ -1,5 +1,5 @@
import type {FormInstance} from 'antd' import type {FormInstance} from 'antd'
import {Alert, Form, Input} from 'antd' import {Alert, Form, Input, Typography} from 'antd'
import React from 'react' import React from 'react'
import type {Connector} from '../../api/connectors' import type {Connector} from '../../api/connectors'
import {ConnectorProvider} from '../../api/connectors' import {ConnectorProvider} from '../../api/connectors'
@@ -31,6 +31,9 @@ export default function NamecomConnectorForm({form, onCreate}: {
<Form.Item <Form.Item
label={t`Username`} label={t`Username`}
name={['authData', 'username']} name={['authData', 'username']}
help={<Typography.Link target='_blank' href='https://www.name.com/account/settings/api'>
{t`Retrieve a set of tokens from your customer account on the Provider's website`}
</Typography.Link>}
> >
<Input autoComplete='off'/> <Input autoComplete='off'/>
</Form.Item> </Form.Item>

View File

@@ -2,7 +2,7 @@ import {t} from 'ttag'
import {regionNames} from "../../../i18n" import {regionNames} from "../../../i18n"
import React, {useState} from 'react' import React, {useState} from 'react'
import type {FormInstance} from "antd" import type {FormInstance} from "antd"
import {Form, Input, Popconfirm, Select} from "antd" import {Form, Input, Popconfirm, Select, Typography} from "antd"
import type {Connector} from "../../api/connectors" import type {Connector} from "../../api/connectors"
import {ConnectorProvider} from "../../api/connectors" import {ConnectorProvider} from "../../api/connectors"
import DefaultConnectorFormItems from "./DefaultConnectorFormItems" import DefaultConnectorFormItems from "./DefaultConnectorFormItems"
@@ -48,6 +48,12 @@ export default function OvhCloudConnectorForm({form, onCreate}: {
label={t`Application key`} label={t`Application key`}
name={['authData', 'appKey']} name={['authData', 'appKey']}
rules={[{required: true, message: t`Required`}]} rules={[{required: true, message: t`Required`}]}
help={<Typography.Link
target='_blank'
href='https://api.ovh.com/createToken/?GET=/order/cart&GET=/order/cart/*&POST=/order/cart&POST=/order/cart/*&DELETE=/order/cart/*&GET=/domain/extensions'
>
{t`Retrieve a set of tokens from your customer account on the Provider's website`}
</Typography.Link>}
> >
<Input autoComplete='off'/> <Input autoComplete='off'/>
</Form.Item> </Form.Item>

View File

@@ -17,34 +17,28 @@ export const formItemLayoutWithOutLabel = {
export type ProviderConfig = { export type ProviderConfig = {
tosLink: string tosLink: string
tokenLink: string
form: ({form, onCreate}: { form: FormInstance, onCreate: (values: Connector) => void }) => React.ReactElement form: ({form, onCreate}: { form: FormInstance, onCreate: (values: Connector) => void }) => React.ReactElement
} }
export const providersConfig: Record<ConnectorProvider, ProviderConfig> = { export const providersConfig: Record<ConnectorProvider, ProviderConfig> = {
[ConnectorProvider.OVHcloud]: { [ConnectorProvider.OVHcloud]: {
tosLink: 'https://www.ovhcloud.com/en/terms-and-conditions/contracts/', tosLink: 'https://www.ovhcloud.com/en/terms-and-conditions/contracts/',
tokenLink: 'https://api.ovh.com/createToken/?GET=/order/cart&GET=/order/cart/*&POST=/order/cart&POST=/order/cart/*&DELETE=/order/cart/*&GET=/domain/extensions',
form: OvhCloudConnectorForm form: OvhCloudConnectorForm
}, },
[ConnectorProvider.Gandi]: { [ConnectorProvider.Gandi]: {
tosLink: 'https://www.gandi.net/en/contracts/terms-of-service', tosLink: 'https://www.gandi.net/en/contracts/terms-of-service',
tokenLink: 'https://admin.gandi.net/organizations/account/pat',
form: GandiConnectorForm form: GandiConnectorForm
}, },
[ConnectorProvider.Namecheap]: { [ConnectorProvider.Namecheap]: {
tosLink: 'https://www.namecheap.com/legal/universal/universal-tos/', tosLink: 'https://www.namecheap.com/legal/universal/universal-tos/',
tokenLink: 'https://ap.www.namecheap.com/settings/tools/apiaccess/',
form: NamecheapConnectorForm form: NamecheapConnectorForm
}, },
[ConnectorProvider.AutoDNS]: { [ConnectorProvider.AutoDNS]: {
tosLink: 'https://www.internetx.com/agb/', tosLink: 'https://www.internetx.com/agb/',
tokenLink: 'https://en.autodns.com/domain-robot-api/',
form: AutoDnsConnectorForm form: AutoDnsConnectorForm
}, },
[ConnectorProvider["Name.com"]]: { [ConnectorProvider["Name.com"]]: {
tosLink: 'https://www.name.com/policies/', tosLink: 'https://www.name.com/policies/',
tokenLink: 'https://www.name.com/account/settings/api',
form: NamecomConnectorForm form: NamecomConnectorForm
} }
} }

View File

@@ -44,23 +44,23 @@ msgstr ""
#: assets/components/RegisterForm.tsx:39 #: assets/components/RegisterForm.tsx:39
#: assets/components/RegisterForm.tsx:47 #: assets/components/RegisterForm.tsx:47
#: assets/components/search/DomainSearchBar.tsx:28 #: assets/components/search/DomainSearchBar.tsx:28
#: assets/components/tracking/watchlist/WatchlistForm.tsx:125 #: assets/components/tracking/watchlist/WatchlistForm.tsx:119
#: assets/components/tracking/watchlist/WatchlistForm.tsx:228 #: assets/components/tracking/watchlist/WatchlistForm.tsx:222
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:40 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:38
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:47 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:49
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:62 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:64
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:85 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:87
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:15 #: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:15
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:30 #: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:30
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:41 #: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:41
#: assets/utils/providers/forms/GandiConnectorForm.tsx:36 #: assets/utils/providers/forms/GandiConnectorForm.tsx:32
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:50 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:50
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:58 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:64
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:66 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:72
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:74 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:80
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:82 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:88
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:89 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:95
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:97 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:103
msgid "Required" msgid "Required"
msgstr "" msgstr ""
@@ -155,7 +155,7 @@ msgid "Entities"
msgstr "" msgstr ""
#: assets/components/search/DomainSearchBar.tsx:31 #: assets/components/search/DomainSearchBar.tsx:31
#: assets/components/tracking/watchlist/WatchlistForm.tsx:128 #: assets/components/tracking/watchlist/WatchlistForm.tsx:122
msgid "This domain name does not appear to be valid" msgid "This domain name does not appear to be valid"
msgstr "" msgstr ""
@@ -410,79 +410,79 @@ msgstr ""
msgid "Watchlist" msgid "Watchlist"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:81 #: assets/components/tracking/watchlist/WatchlistForm.tsx:75
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:93 #: assets/components/tracking/watchlist/WatchlistForm.tsx:87
msgid "Watchlist Name" msgid "Watchlist Name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:94 #: assets/components/tracking/watchlist/WatchlistForm.tsx:88
msgid "Naming the Watchlist makes it easier to find in the list below." msgid "Naming the Watchlist makes it easier to find in the list below."
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:105 #: assets/components/tracking/watchlist/WatchlistForm.tsx:99
msgid "At least one domain name" msgid "At least one domain name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:116 #: assets/components/tracking/watchlist/WatchlistForm.tsx:110
msgid "Domain names" msgid "Domain names"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:134 #: assets/components/tracking/watchlist/WatchlistForm.tsx:128
msgid "Domain name" msgid "Domain name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:153 #: assets/components/tracking/watchlist/WatchlistForm.tsx:147
msgid "Add a Domain name" msgid "Add a Domain name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:161 #: assets/components/tracking/watchlist/WatchlistForm.tsx:155
msgid "Tracked events" msgid "Tracked events"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:163 #: assets/components/tracking/watchlist/WatchlistForm.tsx:157
msgid "At least one trigger" msgid "At least one trigger"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:187 #: assets/components/tracking/watchlist/WatchlistForm.tsx:181
#: assets/components/tracking/watchlist/WatchlistForm.tsx:202 #: assets/components/tracking/watchlist/WatchlistForm.tsx:196
msgid "Connector" msgid "Connector"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:197 #: assets/components/tracking/watchlist/WatchlistForm.tsx:191
msgid "" msgid ""
"Please make sure the connector information is valid to purchase a domain " "Please make sure the connector information is valid to purchase a domain "
"that may be available soon." "that may be available soon."
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:219 #: assets/components/tracking/watchlist/WatchlistForm.tsx:213
msgid "DSN" msgid "DSN"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:231 #: assets/components/tracking/watchlist/WatchlistForm.tsx:225
msgid "This DSN does not appear to be valid" msgid "This DSN does not appear to be valid"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:255 #: assets/components/tracking/watchlist/WatchlistForm.tsx:249
msgid "Check out this link to the Symfony documentation to help you build the DSN" msgid "Check out this link to the Symfony documentation to help you build the DSN"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:265 #: assets/components/tracking/watchlist/WatchlistForm.tsx:259
msgid "Add a Webhook" msgid "Add a Webhook"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:275 #: assets/components/tracking/watchlist/WatchlistForm.tsx:269
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:52 #: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:52
msgid "Create" msgid "Create"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:275 #: assets/components/tracking/watchlist/WatchlistForm.tsx:269
msgid "Update" msgid "Update"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:278 #: assets/components/tracking/watchlist/WatchlistForm.tsx:272
msgid "Reset" msgid "Reset"
msgstr "" msgstr ""
@@ -1095,45 +1095,51 @@ msgid ""
"if the domain you want to register is supported." "if the domain you want to register is supported."
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:34 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:33
msgid "AutoDNS Username" msgid "AutoDNS Username"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:38 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:36
msgid ""
"Because of some limitations in API of AutoDNS, we suggest to create an "
"dedicated user for API with limited rights"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:43
msgid "AutoDNS Password"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:47
msgid "" msgid ""
"Attention: AutoDNS do not support 2-Factor Authentication on API Users for " "Attention: AutoDNS do not support 2-Factor Authentication on API Users for "
"automated systems" "automated systems"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:45 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:55
msgid "AutoDNS Password"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:53
msgid "Owner nic-handle" msgid "Owner nic-handle"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:57 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:59
msgid "The nic-handle of the domain name owner" msgid "The nic-handle of the domain name owner"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:59 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:61
msgid "You can get it from this page" msgid "You can get it from this page"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:69 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:71
msgid "Context Value" msgid "Context Value"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:73 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:75
msgid "If you not sure, use the default value 4" msgid "If you not sure, use the default value 4"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:82 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:84
msgid "Owner confirmation" msgid "Owner confirmation"
msgstr "" msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:89 #: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:91
msgid "Owner confirms his consent of domain order jobs" msgid "Owner confirms his consent of domain order jobs"
msgstr "" msgstr ""
@@ -1165,23 +1171,42 @@ msgid ""
"the Provider's API" "the Provider's API"
msgstr "" msgstr ""
#: assets/utils/providers/forms/GandiConnectorForm.tsx:34 #: assets/utils/providers/forms/GandiConnectorForm.tsx:27
msgid "Personal Access Token (PAT)" msgid "Personal Access Token (PAT)"
msgstr "" msgstr ""
#: assets/utils/providers/forms/GandiConnectorForm.tsx:41 #: assets/utils/providers/forms/GandiConnectorForm.tsx:30
msgid ""
"Retrieve a Personal Access Token from your customer account on the "
"Provider's website"
msgstr ""
#: assets/utils/providers/forms/GandiConnectorForm.tsx:37
msgid "Organization sharing ID" msgid "Organization sharing ID"
msgstr "" msgstr ""
#: assets/utils/providers/forms/GandiConnectorForm.tsx:45 #: assets/utils/providers/forms/GandiConnectorForm.tsx:41
msgid "It indicates the organization that will pay for the ordered product" msgid "It indicates the organization that will pay for the ordered product"
msgstr "" msgstr ""
#: assets/utils/providers/forms/NamecheapConnectorForm.tsx:34 #: assets/utils/providers/forms/NamecheapConnectorForm.tsx:31
#: assets/utils/providers/forms/NamecomConnectorForm.tsx:38 msgid ""
"Retreive an API key and whitelist this instance's IP address on Namecheap's "
"website"
msgstr ""
#: assets/utils/providers/forms/NamecheapConnectorForm.tsx:37
#: assets/utils/providers/forms/NamecomConnectorForm.tsx:41
msgid "API key" msgid "API key"
msgstr "" msgstr ""
#: assets/utils/providers/forms/NamecomConnectorForm.tsx:35
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:55
msgid ""
"Retrieve a set of tokens from your customer account on the Provider's "
"website"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:21 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:21
msgid "European Region" msgid "European Region"
msgstr "" msgstr ""
@@ -1209,35 +1234,35 @@ msgid ""
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:48 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:48
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:72 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:78
msgid "Application key" msgid "Application key"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:56 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:62
msgid "Application secret" msgid "Application secret"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:64 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:70
msgid "Consumer key" msgid "Consumer key"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:80 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:86
msgid "OVH Endpoint" msgid "OVH Endpoint"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:87 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:93
msgid "OVH subsidiary" msgid "OVH subsidiary"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:95 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:101
msgid "OVH pricing mode" msgid "OVH pricing mode"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:100 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:106
msgid "Confirm pricing mode" msgid "Confirm pricing mode"
msgstr "" msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:101 #: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:107
msgid "" msgid ""
"Are you sure about this setting? This may result in additional charges from " "Are you sure about this setting? This may result in additional charges from "
"the API Provider" "the API Provider"