docs/api-references/provider-rest-api.md

546 lines
13 KiB
Markdown
Raw Normal View History

# Provider REST API
## Ocean Provider Endpoints Specification
This document specifies the endpoints for Ocean Provider to be implemented by the core developers.
### nonce endpoint
#### GET /api/services/nonce
Parameters
```
userAddress: String object containing a user's ethereum address
```
Returns: Json object containing the nonce value.
Example:
```
POST /api/services/nonce?userAddress=0x990922334
```
Response:
```json
{
"nonce": 23
}
```
### Encrypt endpoint
#### GET /api/services/encrypt
Body: binary application/octet-stream
Returns: Bytes string containing the encrypted document.
Example:
```
POST /api/services/encrypt
body: b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\ ... \x00\x04YZ'
```
Response:
```
b'0x04b2bfab1f4e...7ed0573'
```
### Decrypt endpoint
#### POST /api/services/decrypt
Parameters
```
decrypterAddress: String object containing the address of the decrypter (required)
chainId: the chain id of the network the document is on (required)
transactionId: the transaction id of the encrypted document (optional)
dataNftAddress: the address of the data nft (optional)
encryptedDocument: the encrypted document (optional)
flags: the flags of the encrypted document (optional)
documentHash: the hash of the encrypted document (optional)
nonce: the nonce of the encrypted document (required)
signature: the signature of the encrypted document (required)
```
Returns: Bytes string containing the decrypted document.
Example:
```
POST /api/services/decrypt
payload: {
'decrypterAddress':'0xA78deb2Fa79463945C247991075E2a0e98Ba7A09'
'chainId':8996
'dataNftAddress':'0xBD558814eE914800EbfeF4a1cbE196F5161823d9'
'encryptedDocument':'0xfd377a585a0...f07afef7dc214'
'flags': 1
'documentHash':'0x0cb38a7bba49758a86f8556642aff655d00e41da28240d5ea0f596b74094d91f'
'nonce':'1644315615.24195'
'signature':'0xd6f27047853203824ab9e5acef87d0a501a64aee93f33a83b6f91cbe8fb4489824defceaccde91273f41290cb2a0c15572368e8bea0b456c7a653659cad7de311b'
}
```
Response:
```
b'{"@context": ["https://w3id.org/did/v1"], "id": "did:op:0c184915b07b44c888d468be85a9b28253e80070e5294b1aaed81c ...'
```
### Initial service request endpoint
#### GET /api/services/initialize
Parameters
```
documentId: String object containing document id (e.g. a DID)
serviceId: String, ID of the service the datatoken is attached to
consumerAddress: String object containing consumer's address
environment: String representing a compute environment offered by the provider
validUntil: Integer, date of validity of the service (optional)
fileIndex: Integer, the index of the file from the files list in the dataset. If set, provider will validate the file access. (optional)
```
Returns: Json document with a quote for amount of tokens to transfer to the provider account.
Example:
```
GET /api/services/initialize
payload:
{
"documentId":"0x1111",
"serviceId": 0,
"consumerAddress":"0x990922334",
}
payload (with optional parameters):
{
"documentId":"0x1111",
"serviceId": 0,
"consumerAddress":"0x990922334",
"validUntil": 1578004800,
"fileIndex": 1
}
```
Response:
```json
{
"datatoken": "0x21fa3ea32892091...",
"nonce": 23,
"providerFee": {
"providerFeeAddress": "0xabc123...",
"providerFeeToken": "0xabc123...",
"providerFeeAmount": "200",
"providerData": "0xabc123...",
"v": 27,
"r": "0xabc123...",
"s": "0xabc123...",
"validUntil": 123456,
}
"computeAddress": "0x8123jdf8sdsa..."
}
```
### Download endpoint
#### GET /api/services/download
Parameters
```
documentId: String object containing document id (e.g. a DID)
serviceId: String, representing the list of `file` objects that describe each file in the dataset
transferTxId: Hex string -- the id of on-chain transaction for approval of datatokens transfer
given to the provider's account
fileIndex: integer, the index of the file from the files list in the dataset
nonce: Nonce
consumerAddress: String object containing consumer's address
signature: String object containg user signature (signed message)
```
Returns: File stream
Example:
```
POST /api/services/download
payload:
{
"documentId":"0x1111",
"serviceId": 0,
"fileIndex": 0,
"datatoken": "",
"consumerAddress":"0x990922334",
"signature":"0x00110011",
"transferTxId": "0xa09fc23421345532e34829"
```
Response:
```json
{
"": ""
}
```
### File info endpoint
#### POST /api/services/fileinfo
Retrieves Content-Type and Content-Length from the given URL or asset.
Parameters
```
type: String, either "url" or "asset"
did: String, DID of the dataset
hash: String, hash of the file
url: String, URL of the file
serviceId: String, ID of the service the datatoken is attached to
```
Returns: Json document file info object
Example:
```
POST /api/services/fileinfo
payload:
{
"url": "https://s3.amazonaws.com/testfiles.oceanprotocol.com/info.0.json",
"type": "url",
"method": "GET",
}
```
Response:
```json
[
{
"contentLength":"1161"
"contentType":"application/json"
"index":0
"valid": true
},...
]
```
### Compute endpoints
All compute endpoints respond with an Array of status objects, each object describing a compute job info.
Each status object will contain:
```
owner:The owner of this compute job
documentId: String object containing document id (e.g. a DID)
jobId: String object containing workflowId
dateCreated: Unix timestamp of job creation
dateFinished: Unix timestamp when job finished (null if job not finished)
status: Int, see below for list
statusText: String, see below
algorithmLogUrl: URL to get the algo log (for user)
resultsUrls: Array of URLs for algo outputs
resultsDid: If published, the DID
```
Status description (`statusText`): (see Operator-Service for full status list)
| status | Description |
| ------ | ----------------------------- |
| 1 | Warming up |
| 10 | Job started |
| 20 | Configuring volumes |
| 30 | Provisioning success |
| 31 | Data provisioning failed |
| 32 | Algorithm provisioning failed |
| 40 | Running algorith |
| 50 | Filtering results |
| 60 | Publishing results |
| 70 | Job completed |
### Create new job or restart an existing stopped job
#### POST /api/services/compute
Start a new job
Parameters
```
signature: String object containg user signature (signed message) (required)
consumerAddress: String object containing consumer's ethereum address (required)
nonce: Integer, Nonce (required)
environment: String representing a compute environment offered by the provider
dataset: Json object containing dataset information
dataset.documentId: String, object containing document id (e.g. a DID) (required)
dataset.serviceId: String, ID of the service the datatoken is attached to (required)
dataset.transferTxId: Hex string, the id of on-chain transaction for approval of datatokens transfer
given to the provider's account (required)
dataset.userdata: Json, user-defined parameters passed to the dataset service (optional)
algorithm: Json object, containing algorithm information
algorithm.documentId: Hex string, the did of the algorithm to be executed (optional)
algorithm.meta: Json object, defines the algorithm attributes and url or raw code (optional)
algorithm.serviceId: String, ID of the service to use to process the algorithm (optional)
algorithm.transferTxId: Hex string, the id of on-chain transaction of the order to use the algorithm (optional)
algorithm.userdata: Json, user-defined parameters passed to the algorithm running service (optional)
algorithm.algocustomdata: Json object, algorithm custom parameters (optional)
additionalDatasets: Json object containing a list of dataset objects (optional)
One of `algorithm.documentId` or `algorithm.meta` is required, `algorithm.meta` takes precedence
```
Returns: Array of `status` objects as described above, in this case the array will have only one object
Example:
```
POST /api/compute
payload:
{
"signature": "0x00110011",
"consumerAddress": "0x123abc",
"nonce": 1,
"environment": "env",
"dataset": {
"documentId": "did:op:2222...",
"serviceId": "compute",
"transferTxId": "0x0232123..."
}
}
```
Response:
```json
[
{
"jobId": "0x1111:001",
"status": 1,
"statusText": "Job started",
...
}
]
```
### Status and Result
#### GET /api/services/compute
Get all jobs and corresponding stats
Parameters
```
signature: String object containg user signature (signed message)
documentId: String object containing document did (optional)
jobId: String object containing workflowID (optional)
consumerAddress: String object containing consumer's address (optional)
At least one parameter from documentId, jobId and owner is required (can be any of them)
```
Returns
Array of `status` objects as described above
Example:
```
GET /api/services/compute?signature=0x00110011&documentId=did:op:1111&jobId=012023
```
Response:
```json
[
{
"owner": "0x1111",
"documentId": "did:op:2222",
"jobId": "3333",
"dateCreated": "2020-10-01T01:00:00Z",
"dateFinished": "2020-10-01T01:00:00Z",
"status": 5,
"statusText": "Job finished",
"algorithmLogUrl": "http://example.net/logs/algo.log",
"resultsUrls": [
"http://example.net/logs/output/0",
"http://example.net/logs/output/1"
],
"resultsDid": "did:op:87bdaabb33354d2eb014af5091c604fb4b0f67dc6cca4d18a96547bffdc27bcf"
},
{
"owner": "0x1111",
"documentId": "did:op:2222",
"jobId": "3334",
"dateCreated": "2020-10-01T01:00:00Z",
"dateFinished": "2020-10-01T01:00:00Z",
"status": 5,
"statusText": "Job finished",
"algorithmLogUrl": "http://example.net/logs2/algo.log",
"resultsUrls": [
"http://example.net/logs2/output/0",
"http://example.net/logs2/output/1"
],
"resultsDid": ""
}
]
```
### Stop
#### PUT /api/services/compute
Stop a running compute job.
Parameters
```
signature: String object containg user signature (signed message)
documentId: String object containing document did (optional)
jobId: String object containing workflowID (optional)
consumerAddress: String object containing consumer's address (optional)
At least one parameter from documentId,jobId and owner is required (can be any of them)
```
Returns
Array of `status` objects as described above
Example:
```
PUT /api/services/compute?signature=0x00110011&documentId=did:op:1111&jobId=012023
```
Response:
```json
[
{
...,
"status": 7,
"statusText": "Job stopped",
...
}
]
```
### Delete
#### DELETE /api/services/compute
Delete a compute job and all resources associated with the job. If job is running it will be stopped first.
Parameters
```
signature: String object containg user signature (signed message)
documentId: String object containing document did (optional)
jobId: String object containing workflowId (optional)
consumerAddress: String object containing consumer's address (optional)
At least one parameter from documentId, jobId is required (can be any of them)
in addition to consumerAddress and signature
```
Returns
Array of `status` objects as described above
Example:
```
DELETE /api/services/compute?signature=0x00110011&documentId=did:op:1111&jobId=012023
```
Response:
```json
[
{
...,
"status": 8,
"statusText": "Job deleted successfully",
...
}
]
```
#### GET /api/services/computeResult
Allows download of asset data file.
Parameters
```
jobId: String object containing workflowId (optional)
index: Integer, index of the result to download (optional)
consumerAddress: String object containing consumer's address (optional)
nonce: Integer, Nonce (required)
signature: String object containg user signature (signed message)
```
Returns: Bytes string containing the compute result.
Example:
```
GET /api/services/computeResult?index=0&consumerAddress=0xA78deb2Fa79463945C247991075E2a0e98Ba7A09&jobId=4d32947065bb46c8b87c1f7adfb7ed8b&nonce=1644317370
```
Response:
```
b'{"result": "0x0000000000000000000000000000000000000000000000000000000000000001"}'
```
#### GET /api/services/computeEnvironments
Allows download of asset data file.
Parameters
```
```
Returns: List of compute environments.
Example:
```
GET /api/services/computeEnvironments
```
Response:
```json
[
{
"cpuType":"AMD Ryzen 7 5800X 8-Core Processor"
"currentJobs":0
"desc":"This is a mocked enviroment"
"diskGB":2
"gpuType":"AMD RX570"
"id":"ocean-compute"
"maxJobs":10
"nCPU":2
"nGPU":0
"priceMin":2.3
"ramGB":1
},
...
]
```