> For the complete documentation index, see [llms.txt](https://locoia.gitbook.io/connectors/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://locoia.gitbook.io/connectors/base-connector-setup/graphql-apis.md).

# GraphQL APIs

This feature shows the typical GraphQL autocomplete, which is derived from the API's schema, in GraphQL code fields.

## Feature Introduction

This feature shows the typical GraphQL autocomplete, which is derived from the API's schema, in GraphQL code fields.

![GraphQL autocomplete](https://1752122159-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpN4SnIA1JI7uGLmi8QM%2Fuploads%2FaVAPh1zWLPizlw72BWZJ%2Fimage.png?alt=media\&token=d63c7340-4c20-4359-bd6b-f30a580def4d)

## Configuration on connector

On the connector the field **External schema config** has to be filled with a JSON that describes where the schema can be found.

The necessary details for the configuration can usually be found in the Connector's API documentation or, if the API offers this, on their GraphQL 'playground'.

```json
{
    "endpoint": "graphql",
    "body": {
      "operationName": "IntrospectionQuery",
      "variables": {},
      "query": "query IntrospectionQuery {\\n  __schema {\\n    queryType {\\n      name\\n    }\\n    mutationType {\\n      name\\n    }\\n    subscriptionType {\\n      name\\n    }\\n    types {\\n      ...FullType\\n    }\\n    directives {\\n      name\\n      description\\n locations\\n      args {\\n        ...InputValue\\n      }\\n    }\\n  }\\n}\\n\\nfragment FullType on __Type {\\n  kind\\n  name\\n  description\\n  fields(includeDeprecated: true) {\\n    name\\n    description\\n args {\\n      ...InputValue\\n    }\\n    type {\\n      ...TypeRef\\n    }\\n    isDeprecated\\n    deprecationReason\\n  }\\n  inputFields {\\n    ...InputValue\\n  }\\n  interfaces {\\n    ...TypeRef\\n  }\\n  enumValues(includeDeprecated: true) {\\n    name\\n    description\\n    isDeprecated\\n    deprecationReason\\n  }\\n  possibleTypes {\\n    ...TypeRef\\n  }\\n}\\n\\nfragment InputValue on __InputValue {\\n  name\\n  description\\n  type {\\n    ...TypeRef\\n  }\\n  defaultValue\\n}\\n\\nfragment TypeRef on __Type {\\n  kind\\n  name\\n  ofType {\\n    kind\\n    name\\n    ofType {\\n      kind\\n      name\\n      ofType {\\n        kind\\n        name\\n        ofType {\\n          kind\\n          name\\n          ofType {\\n            kind\\n            name\\n            ofType {\\n              kind\\n              name\\n              ofType {\\n                kind\\n                name\\n              }\\n            }\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n"
    }
}
```

### `endpoint`

This is the endpoint of the call, which is appended to the Connector's base domain.

In case it uses a different base domain, the entire endpoint URL can be written instead.

### `body`

This is the request body that should be sent to the endpoint.

If this parameter is present, a `POST` call will be made.

### `use_connector_auth`

*Optional*

This field needs to be set to `true` in case the schema endpoint can only be accessed with a Connector Auth.

## Configuration on action

In all actions where the schema should be used for autocomplete, there needs to be a code field with the mode `graphql`, e.g.

```json
"query": {
    "type": "code",
    "mode": "graphql",
    "title": "Query String",
    "info": "GraphQL Query",
    "rows": 2
  }
```

If the field and an external schema configuration is present (and setup correctly), GraphQL autocomplete and validation will show up.

Here it makes sense to have a `graphql_wildcard` action, just like [this one](https://app.locoia.com/#/settings/connector/d5584605-8f99-4b9f-a552-3a442596e352/action?page=1\&perPage=10\&nameSearchString=graphql_wildcard\&selectedTag\&sortProp=name\&sortOrder=ascending).

## Examples

### Vodafone

The necessary details for the external schema config can be found on [Vodafone GK's GraphQL playground page](https://gk4null.de/graphql). When looking in the network tab, there's a request `graphql`, which includes all required details:

![GraphQL schema request details from https://gk4null.de/graphql](https://1752122159-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpN4SnIA1JI7uGLmi8QM%2Fuploads%2FgbXBHP7x9n9DX35e0def%2Fimage.png?alt=media\&token=125844e4-fe8e-4c67-98c4-dab013433a10)

```json
{
    "endpoint": "graphql",
    "body": {
      "operationName": "IntrospectionQuery",
      "variables": {},
      "query": "query IntrospectionQuery {\\n  __schema {\\n    queryType {\\n      name\\n    }\\n    mutationType {\\n      name\\n    }\\n    subscriptionType {\\n      name\\n    }\\n    types {\\n      ...FullType\\n    }\\n    directives {\\n      name\\n      description\\n locations\\n      args {\\n        ...InputValue\\n      }\\n    }\\n  }\\n}\\n\\nfragment FullType on __Type {\\n  kind\\n  name\\n  description\\n  fields(includeDeprecated: true) {\\n    name\\n    description\\n args {\\n      ...InputValue\\n    }\\n    type {\\n      ...TypeRef\\n    }\\n    isDeprecated\\n    deprecationReason\\n  }\\n  inputFields {\\n    ...InputValue\\n  }\\n  interfaces {\\n    ...TypeRef\\n  }\\n  enumValues(includeDeprecated: true) {\\n    name\\n    description\\n    isDeprecated\\n    deprecationReason\\n  }\\n  possibleTypes {\\n    ...TypeRef\\n  }\\n}\\n\\nfragment InputValue on __InputValue {\\n  name\\n  description\\n  type {\\n    ...TypeRef\\n  }\\n  defaultValue\\n}\\n\\nfragment TypeRef on __Type {\\n  kind\\n  name\\n  ofType {\\n    kind\\n    name\\n    ofType {\\n      kind\\n      name\\n      ofType {\\n        kind\\n        name\\n        ofType {\\n          kind\\n          name\\n          ofType {\\n            kind\\n            name\\n            ofType {\\n              kind\\n              name\\n              ofType {\\n                kind\\n                name\\n              }\\n            }\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n"
    }
}
```

### EverReal

EverReal uses a different base domain for the GraphQL schema, thus the entire URL has to be provided in the `endpoint` field.

```json
{
  "endpoint": "https://app.everreal.co/api/reporting/graphql",
  "body": {
    "operationName": "IntrospectionQuery",
    "variables": {},
    "query": "query IntrospectionQuery {\\n  __schema {\\n    queryType {\\n      name\\n    }\\n    mutationType {\\n      name\\n    }\\n    subscriptionType {\\n      name\\n    }\\n    types {\\n      ...FullType\\n    }\\n    directives {\\n      name\\n      description\\n      locations\\n      args {\\n        ...InputValue\\n      }\\n    }\\n  }\\n}\\n\\nfragment FullType on __Type {\\n  kind\\n  name\\n  description\\n  fields(includeDeprecated: true) {\\n    name\\n    description\\n    args {\\n      ...InputValue\\n    }\\n    type {\\n      ...TypeRef\\n    }\\n    isDeprecated\\n    deprecationReason\\n  }\\n  inputFields {\\n    ...InputValue\\n  }\\n  interfaces {\\n    ...TypeRef\\n  }\\n  enumValues(includeDeprecated: true) {\\n    name\\n    description\\n    isDeprecated\\n    deprecationReason\\n  }\\n  possibleTypes {\\n    ...TypeRef\\n  }\\n}\\n\\nfragment InputValue on __InputValue {\\n  name\\n  description\\n  type {\\n    ...TypeRef\\n  }\\n  defaultValue\\n}\\n\\nfragment TypeRef on __Type {\\n  kind\\n  name\\n  ofType {\\n    kind\\n    name\\n    ofType {\\n      kind\\n      name\\n      ofType {\\n        kind\\n        name\\n        ofType {\\n          kind\\n          name\\n          ofType {\\n            kind\\n            name\\n            ofType {\\n              kind\\n              name\\n              ofType {\\n                kind\\n                name\\n              }\\n            }\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n"
  }
}
```

### Monday

Monday's schema can be found directly on their base domain, thus the `endpoint` field is just an empty string.

However, to read the schema details authentication has to be send in the request as well. Thus, `"use_connector_auth": true` has to be included.

```json
{
  "endpoint": "",
  "body": {
    "query": "\\n    query IntrospectionQuery {\\n      __schema {\\n        queryType { name }\\n        mutationType { name }\\n        subscriptionType { name }\\n        types {\\n          ...FullType\\n        }\\n        directives {\\n          name\\n          description\\n          locations\\n          args {\\n            ...InputValue\\n          }\\n        }\\n      }\\n    }\\n\\n    fragment FullType on __Type {\\n      kind\\n      name\\n      description\\n      fields(includeDeprecated: true) {\\n        name\\n        description\\n        args {\\n          ...InputValue\\n        }\\n        type {\\n          ...TypeRef\\n        }\\n        isDeprecated\\n        deprecationReason\\n      }\\n      inputFields {\\n        ...InputValue\\n      }\\n      interfaces {\\n        ...TypeRef\\n      }\\n      enumValues(includeDeprecated: true) {\\n        name\\n        description\\n        isDeprecated\\n        deprecationReason\\n      }\\n      possibleTypes {\\n        ...TypeRef\\n      }\\n    }\\n\\n    fragment InputValue on __InputValue {\\n      name\\n      description\\n      type { ...TypeRef }\\n      defaultValue\\n    }\\n\\n    fragment TypeRef on __Type {\\n      kind\\n      name\\n      ofType {\\n        kind\\n        name\\n        ofType {\\n          kind\\n          name\\n          ofType {\\n            kind\\n            name\\n            ofType {\\n              kind\\n              name\\n              ofType {\\n                kind\\n                name\\n                ofType {\\n                  kind\\n                  name\\n                  ofType {\\n                    kind\\n                    name\\n                  }\\n                }\\n              }\\n            }\\n          }\\n        }\\n      }\\n    }\\n  "
  },
  "use_connector_auth": true
}
```
