Operations 2
Documentation
Documentation
https://helpdesk.castoredc.com/hc/en-us/articles/27149233860509-Castor-EDC-CDMS-Application-Programming-Interface-API
APIReference
https://data.castoredc.com/api
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/castoredc:castoredc-metadata-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
version: 2026.1.6.1
title: Castor EDC API Documentation Metadata API
description: '### Overview
This document provides the specifications of the Castor EDC API, describing the currently available
API endpoints and methods. We aim to provide a fully functional RESTful API to communicate with
Castor EDC and these are endpoints currently available.
The formal OpenAPI 2 specification by which this page is rendered is also available in the following formats:
* YAML
* JSON
* JSON (pretty print)
### Authentication & Authorization with OAuth 2
Authentication and authorization are arranged through OAuth2. We currently provide full support for the Client
Credentials flow. The Authorization Code flow is supported, but we ask you to contact us if you want to use this flow.
To use the Client Credentials flow go to your
Castor EDC profile and generate
a Client ID and Client Secret. Use the Client ID and Client Secret to retrieve an access token by making a request to
the ''/oauth/token'' endpoint with your client_id and client_secret as parameters and grant_type=client_credentials.
PHP Example:
```php
include __DIR__.''/vendor/autoload.php'';
use Guzzle\Http\Client;
// Create the HTTP Client.
$httpClient = new Client(
''https://data.castoredc.com'',
[
''request.options'' => [
''exceptions'' => false,
]
]
);
// Build the request
$request = $httpClient->post(
''/oauth/token'',
null,
[
''client_id'' => ''YourCastorClientId'',
''client_secret'' => ''YourCastorClientSecret'',
''grant_type'' => ''client_credentials'',
]
);
// Send the request
$response = $request->send();
$responseBody = $response->getBody(true);
$responseArr = json_decode($responseBody, true);
$accessToken = $responseArr[''access_token''];
```
In your subsequent requests you can use the `$accessToken` as a Bearer token in the Authorization header, i.e:
```php
$request = $httpClient->get(''/api/user'');
$request->addHeader(''Authorization'', ''Bearer ''. $accessToken);
$response = $request->send();
echo $response->getBody();
```
### OAuth2 Scopes
There are 3 scopes that endpoints may support.
* **default**: allows access to all endpoints
* **study_statistics**: allows access to study statistics
* **record**: allows access to data for a single participant
Due to a bug in the OpenAPI UI, all three scopes are listed for all endpoints.
If the endpoint supports something other than the default scope, the summary will have a 🔭 emoji and the scope will be
listed in the description as well as under the `security:` key in the specification.
### Rate Limits
Unless specified in the resource, endpoints are rate-limited to 600 requests in 10 minutes.
### Legacy (Basic HTTP Authentication)
**Please note: Basic HTTP Authentication has been removed on 2019 August 13**
### Changelog
API changes can be viewed here'
contact:
name: support@castoredc.com
servers:
- url: https://data.castoredc.com/api/
security:
- OAuth2ClientCredentials:
- default
- study_statistics
- record
tags:
- name: Metadata
paths:
/study/{study_id}/metadata:
get:
tags:
- Metadata
summary: Retrieve list of available metadata
security:
- OAuth2ClientCredentials:
- default
description: 'Gets `Metadata` objects.
Always requires a study_id to be given. Can be paged.
Returns HalJson responses (with _links for paging and to single objects).'
parameters:
- name: study_id
in: path
description: The ID of the study for which this call should be made
required: true
schema:
type: string
format: UUID
- name: page
in: query
description: The page to retrieve
required: false
schema:
type: integer
default: 1
responses:
200:
description: List of all metadatas of the Study
content:
application/hal+json:
schema:
title: Fields HalJSON representation
type: object
properties:
_links:
$ref: '#/components/schemas/LinksCollection'
_embedded:
type: object
properties:
steps:
type: array
items:
$ref: '#/components/schemas/Metadata'
page_count:
type: number
page_size:
type: number
total_items:
type: number
page:
type: number
default:
description: Unexpected error
content:
application/hal+json:
schema:
$ref: '#/components/schemas/Error'
operationId: getStudyByStudyIdMetadata
x-operation-id-source: derived
/study/{study_id}/metadata/{metadata_id}:
get:
tags:
- Metadata
summary: Retrieve a single metadata item
security:
- OAuth2ClientCredentials:
- default
description: Returns HalJson objects (with _links).
parameters:
- name: study_id
in: path
description: The ID of the study for which this call should be made
required: true
schema:
type: string
format: UUID
- name: metadata_id
in: path
description: ID of the metadata to fetch
required: true
schema:
type: string
responses:
200:
description: Single Metadata
content:
application/hal+json:
schema:
$ref: '#/components/schemas/Metadata'
default:
description: Unexpected error
content:
application/hal+json:
schema:
$ref: '#/components/schemas/Error'
operationId: getStudyByStudyIdMetadataByMetadataId
x-operation-id-source: derived
components:
schemas:
MetadataType:
type: object
properties:
id:
type: string
format: UUID
description: Unique identifier of the MetadataType
name:
type: string
description: The name of this MetadataType
description:
type: string
description: The description of this MetadataType
_links:
$ref: '#/components/schemas/LinksSingle'
Metadata:
type: object
properties:
id:
type: string
format: UUID
description: Unique identifier of the Metadata
parent_id:
type: string
description: Metadata id of this metadata's parent (circular reference)
value:
type: string
description: The value
description:
type: string
description: The description
_embedded:
type: object
description: The metadataType
properties:
metadata_type:
$ref: '#/components/schemas/MetadataType'
_links:
$ref: '#/components/schemas/LinksSingle'
LinksCollection:
type: object
properties:
self:
type: object
properties:
href:
type: string
first:
type: object
properties:
href:
type: string
last:
type: object
properties:
href:
type: string
next:
type: object
properties:
href:
type: string
LinksSingle:
type: object
properties:
self:
type: object
properties:
href:
type: string
Error:
type: object
properties:
status:
type: integer
format: int32
description: The HTTP return code.
title:
type: string
description: The short error description belonging to the status code
detail:
type: string
description: The detailed explanation of the failure
type:
type: string
description: URL to RFC explaining this statuscode
errors:
type: object
description: Optional list of all errors that occurred during the request
validation_messages:
type: object
description: Optional list of validation failure message
securitySchemes:
OAuth2ClientCredentials:
type: oauth2
flows:
clientCredentials:
scopes:
default: Grants access to everything
study_statistics: Grants access to a study's statistics
record: Grants access to the data for a single participant; intended for use by study subjects
tokenUrl: https://data.castoredc.com/oauth/token
x-provenance:
method: harvested
publisher: Castor
source: https://data.castoredc.com/api/swagger
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)