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

# Higher education

GET https://clients.infonite.tech/api/executions/results/{execution_id}/public/v1/academic/higher-education-degrees

University degrees held by your customer, from the official education registry.

One entry per degree, with the awarding institution and the dates. Background screening against the register rather than against a CV. Field by field in [Academic Records](/guides/data-models/academic).

Features are chosen when the execution **starts**, not here. An execution that did not ask for `academic_data` answers `204`, and the only way to get the data is to run another one.

The same feature produces [Secondary education](api:GET/executions/results/\{execution_id}/public/v1/academic/secondary-education), so asking for it once fills both endpoints.

| Status | Meaning                                                                                                                      |
| :----- | :--------------------------------------------------------------------------------------------------------------------------- |
| `200`  | The degrees.                                                                                                                 |
| `202`  | `feature_not_ready` — `academic_data` is still running. **Only this family waits**: the ones that already closed answer now. |
| `204`  | The execution never asked for `academic_data`. No body.                                                                      |
| `404`  | No execution with that id for your application, or it has been deleted.                                                      |

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

Reference: https://infonite.dev/api-reference/direct-executions/direct-executions-api/fetching-the-results/public-administration/direct-executions-v-1-results-public-higher-education

## Authentication

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

## Servers

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

## Request

### Path parameters

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

## Response

### 200

**200 OK**University degrees as the ministry records them: the title, the institution that issued it and the date it was obtained — the source is the register, not a CV. **An empty list is an answer, not a gap**: the feature ran and the source reported none.

- `list of object`
  - `product` ("academic_data", required)
  - `sub_family` (enum, required)
    - Allowed values: `academic_data:higher_bachelor`, `academic_data:higher_master`, `academic_data:higher_doctorate`
  - `fetch_date` (string, required) — Date this product was fetched
  - `qualification_name` (string, required) — Qualification name.
  - `institution_name` (string, required) — Institution name.
  - `institution_country` (string, required) — Country of the institution.
  - `completion_status` (string, required) — Completion status
  - `total_credits` (string, required) — ECTS credits (Common in Europe)
  - `grade_average` (string, required) — GPA or local scale (e.g., 0-10 in Spain)
  - `issue_date` (date, optional) — Date when the qualification was issued.
  - `start_date` (date, optional) — Date when the education started.
  - `end_date` (date, optional) — Date when the education ended.
  - `official_id` (string, optional) — National registry number / Diploma serial number.
  - `verification_url` (string, optional) — Link to public administration validator.
  - `thesis_title` (string, optional) — Thesis title - Mandatory for PhD, common for Master
  - `field_of_study` (string, optional) — ISCED-F code or name (e.g., "061 ICTs")

### 202

**202 Accepted**`feature_not_ready`: `academic_data` is still running. **You do not have to wait for the whole execution** — every family answers as soon as its own feature closes, so a slow source does not hold up the ones that already finished.

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

## Errors

### 404 Not Found Error

**404 Not Found**No execution with that id for your application, or it has been deleted.

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

### 422 Unprocessable Entity Error

Validation Error

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

## Examples

### One university degree on the register

**Response**

```json
[
  {
    "product": "academic_data",
    "sub_family": "academic_data:higher_bachelor",
    "fetch_date": "2026-09-12T00:46:01+00:00",
    "qualification_name": "Graduado o Graduada en Administración y Dirección de Empresas por la Universidad Rey Juan Carlos",
    "institution_name": "Universidad Rey Juan Carlos",
    "institution_country": "ES",
    "completion_status": "completed",
    "total_credits": "NaN",
    "grade_average": "NaN",
    "issue_date": "2006-02-23",
    "end_date": "2005-06-28",
    "official_id": "2006000000"
  }
]
```

**SDK Code**

```python One university degree on the register
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees"

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

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

print(response.json())
```

```javascript One university degree on the register
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

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

```go One university degree on the register
package main

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

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees"

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

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

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

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

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

}
```

```ruby One university degree on the register
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees")

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

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

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

```java One university degree on the register
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

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

```php One university degree on the register
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp One university degree on the register
using RestSharp;

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

```swift One university degree on the register
import Foundation

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

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

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

dataTask.resume()
```

### This family has not finished

**Response**

```json
{
  "detail": "feature_not_ready"
}
```

**SDK Code**

```python This family has not finished
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees"

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

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

print(response.json())
```

```javascript This family has not finished
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

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

```go This family has not finished
package main

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

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees"

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

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

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

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

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

}
```

```ruby This family has not finished
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/academic/higher-education-degrees")

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

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

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

```java This family has not finished
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

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

```php This family has not finished
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp This family has not finished
using RestSharp;

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

```swift This family has not finished
import Foundation

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

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

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

dataTask.resume()
```