OpenRelay Transfers API
Move resources between organizations you belong to.
Move resources between organizations you belong to.
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/openrelay-transfers-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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:
description: 'The OpenRelay control-plane REST API. Deploy GPU VMs and inference clusters, manage organizations and billing, and automate your infrastructure. All requests are authenticated with an API key (`vl_…`) unless noted otherwise.
'
title: OpenRelay Account Transfers API
version: 0.1.0
servers:
- description: Production
url: https://api.openrelay.inc
- description: Beta
url: https://api.beta.openrelay.inc
- description: Local development
url: http://localhost:8083
tags:
- description: Move resources between organizations you belong to.
name: Transfers
paths:
/v1/orgs/{orgId}/transfers:
post:
operationId: initiateTransfer
parameters:
- in: path
name: orgId
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/InitiateTransferRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/TransferRequest'
description: Created
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
- apiKey: []
summary: Initiate a resource transfer to another org (owner/admin)
tags:
- Transfers
/v1/orgs/{orgId}/transfers/incoming:
get:
operationId: listIncomingTransfers
parameters:
- in: path
name: orgId
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/TransferItem'
type: array
description: OK
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
security:
- apiKey: []
summary: Pending incoming transfers (enriched)
tags:
- Transfers
/v1/orgs/{orgId}/transfers/outgoing:
get:
operationId: listOutgoingTransfers
parameters:
- in: path
name: orgId
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/TransferItem'
type: array
description: OK
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
security:
- apiKey: []
summary: Outgoing transfers, all statuses (enriched)
tags:
- Transfers
/v1/orgs/{orgId}/transfers/pending-count:
get:
operationId: getTransferPendingCount
parameters:
- in: path
name: orgId
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PendingCount'
description: OK
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
security:
- apiKey: []
summary: Count of pending incoming transfers
tags:
- Transfers
/v1/transfers/target-orgs:
get:
operationId: listTransferTargetOrgs
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/TargetOrg'
type: array
description: OK
'401':
$ref: '#/components/responses/Unauthorized'
security:
- apiKey: []
summary: Orgs the caller belongs to (for the transfer target dropdown)
tags:
- Transfers
/v1/transfers/{id}/accept:
post:
operationId: acceptTransfer
parameters:
- in: path
name: id
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AcceptTransferRequest'
required: false
responses:
'204':
description: Accepted
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
- apiKey: []
summary: Accept a pending incoming transfer (target org owner/admin)
tags:
- Transfers
/v1/transfers/{id}/cancel:
post:
operationId: cancelTransfer
parameters:
- in: path
name: id
required: true
schema:
type: string
responses:
'204':
description: Cancelled
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
- apiKey: []
summary: Cancel a pending outgoing transfer (source org)
tags:
- Transfers
x-openrelay-mcp:
destructiveHint: true
/v1/transfers/{id}/reject:
post:
operationId: rejectTransfer
parameters:
- in: path
name: id
required: true
schema:
type: string
responses:
'204':
description: Rejected
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
- apiKey: []
summary: Reject a pending incoming transfer (target org owner/admin)
tags:
- Transfers
x-openrelay-mcp:
destructiveHint: true
components:
schemas:
Error:
properties:
code:
type: string
error:
type: string
required:
- error
type: object
AcceptTransferRequest:
properties:
sshKeyIds:
items:
type: string
type: array
type: object
PendingCount:
properties:
count:
type: integer
required:
- count
type: object
TargetOrg:
properties:
id:
type: string
name:
type: string
slug:
type: string
required:
- id
- name
- slug
type: object
InitiateTransferRequest:
properties:
note:
type: string
resourceId:
type: string
resourceType:
enum:
- cluster
- vm
type: string
targetOrgSlug:
type: string
required:
- resourceType
- resourceId
- targetOrgSlug
type: object
TransferItem:
properties:
clusterId:
type: string
completedAt:
type: string
createdAt:
type: string
expiresAt:
type: string
id:
type: string
note:
type: string
resourceName:
type: string
resourceType:
type: string
respondedAt:
type: string
sourceOrgName:
type: string
sourceOrgSlug:
type: string
status:
type: string
targetOrgName:
type: string
targetOrgSlug:
type: string
vmId:
type: string
required:
- id
- resourceType
- status
- resourceName
- createdAt
type: object
TransferRequest:
properties:
clusterId:
type: string
completedAt:
type: string
createdAt:
type: string
expiresAt:
type: string
id:
type: string
initiatedBy:
type: string
note:
type: string
resourceType:
type: string
respondedAt:
type: string
respondedBy:
type: string
sourceOrganizationId:
type: string
status:
type: string
targetOrganizationId:
type: string
vmId:
type: string
required:
- id
- resourceType
- sourceOrganizationId
- targetOrganizationId
- status
- createdAt
type: object
responses:
NotFound:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Resource not found
Forbidden:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: API key lacks the required scope
BadRequest:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: The request is invalid
Unauthorized:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Missing or invalid API key
securitySchemes:
apiKey:
description: 'OpenRelay API key. Send it as `Authorization: Bearer vl_…`.'
scheme: bearer
type: http