EQTY LabDocs

Issue policy compliance certificate

Issues a revocable ProjectComplianceV1 credential, signed by the platform DID, stating that the project complies with the policy. It cites every governance statement recorded against the policy in the project, names the caller's DID as the one who authorized it, and expires at expiryDate. The caller needs create_credentials on the project.

posthttps://<host>/gov/v1/policy/compliance/{project_uuid}
bash
curl --request POST \
  --url 'https://<host>/gov/v1/policy/compliance/{project_uuid}' \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{"expiryDate":"2030-07-04T23:59:59Z","policyCid":"policy_cid","subjectCid":"subject_cid"}'
javascript
const response = await fetch("https://<host>/gov/v1/policy/compliance/{project_uuid}", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "expiryDate": "2030-07-04T23:59:59Z",
    "policyCid": "policy_cid",
    "subjectCid": "subject_cid"
  })
});

const data = await response.json();
typescript
interface CertificateIssueResponse {
  credential: Record<string, unknown>;
  credentialId: string;
  sourceCid: string;
}

const response = await fetch("https://<host>/gov/v1/policy/compliance/{project_uuid}", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "expiryDate": "2030-07-04T23:59:59Z",
    "policyCid": "policy_cid",
    "subjectCid": "subject_cid"
  })
});
if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);

const data: CertificateIssueResponse = await response.json();
python
import requests

response = requests.post(
    "https://<host>/gov/v1/policy/compliance/{project_uuid}",
    headers={
        "Authorization": "Bearer <token>",
        "Content-Type": "application/json",
    },
    json={
        "expiryDate": "2030-07-04T23:59:59Z",
        "policyCid": "policy_cid",
        "subjectCid": "subject_cid",
    },
)
response.raise_for_status()
print(response.json())
go
package main

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

func main() {
	body := strings.NewReader(`{
	  "expiryDate": "2030-07-04T23:59:59Z",
	  "policyCid": "policy_cid",
	  "subjectCid": "subject_cid"
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://<host>/gov/v1/policy/compliance/{project_uuid}", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(res.Status, string(data))
}
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://<host>/gov/v1/policy/compliance/{project_uuid}"))
            .header("Authorization", "Bearer <token>")
            .header("Content-Type", "application/json")
            .method("POST", HttpRequest.BodyPublishers.ofString("""
                {
                  "expiryDate": "2030-07-04T23:59:59Z",
                  "policyCid": "policy_cid",
                  "subjectCid": "subject_cid"
                }
                """))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode() + " " + response.body());
    }
}
csharp
using System.Net.Http.Headers;
using System.Text;

using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://<host>/gov/v1/policy/compliance/{project_uuid}");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
request.Content = new StringContent("""
    {
      "expiryDate": "2030-07-04T23:59:59Z",
      "policyCid": "policy_cid",
      "subjectCid": "subject_cid"
    }
    """, Encoding.UTF8, "application/json");

using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
php
<?php

$ch = curl_init('https://<host>/gov/v1/policy/compliance/{project_uuid}');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer <token>',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => <<<'JSON'
    {
      "expiryDate": "2030-07-04T23:59:59Z",
      "policyCid": "policy_cid",
      "subjectCid": "subject_cid"
    }
    JSON,
    CURLOPT_RETURNTRANSFER => true,
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
echo $status . " " . $response . PHP_EOL;
ruby
require "net/http"

uri = URI("https://<host>/gov/v1/policy/compliance/{project_uuid}")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer <token>"
request["Content-Type"] = "application/json"
request.body = <<~'JSON'
  {
    "expiryDate": "2030-07-04T23:59:59Z",
    "policyCid": "policy_cid",
    "subjectCid": "subject_cid"
  }
JSON

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end
puts "#{response.code} #{response.body}"
rust
// Cargo.toml dependencies: reqwest (features "json"), serde_json, tokio (features "full")
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let response = reqwest::Client::new()
        .post("https://<host>/gov/v1/policy/compliance/{project_uuid}")
        .header("Authorization", "Bearer <token>")
        .json(&json!({
            "expiryDate": "2030-07-04T23:59:59Z",
            "policyCid": "policy_cid",
            "subjectCid": "subject_cid"
        }))
        .send()
        .await?;

    println!("{} {}", response.status(), response.text().await?);
    Ok(())
}

Authorizations

  • BearerAuth · HTTP bearer (JWT)

Parameters

Path parameters

NameTypeDescription
project_uuid
required
string

Project UUID

Request bodyrequired

application/json
  • expiryDatestringrequired
  • policyCidstringrequired
  • subjectCidstringrequired
Examplejson
{
  "expiryDate": "2030-07-04T23:59:59Z",
  "policyCid": "policy_cid",
  "subjectCid": "subject_cid"
}

Responses

200Policy compliance certificate issued

application/json
  • credentialobjectrequired
  • credentialIdstringrequired
  • sourceCidstringrequired
Examplejson
{
  "credential": {},
  "credentialId": "urn:uuid:aa115482-3a7d-498a-a05c-983722b501f8",
  "sourceCid": "bafybeibwzifp5oc5mirxgcq"
}

400The policyCid or subjectCid is empty, or the project UUID or expiryDate does not parse

application/json
  • callstackobject
    Show properties

    object | null

  • errorstringrequired
Examplejson
{
  "callstack": {},
  "error": "string"
}

401Missing or invalid bearer token

application/json
  • callstackobject
    Show properties

    object | null

  • errorstringrequired
Examplejson
{
  "callstack": {},
  "error": "string"
}

403Caller lacks create_credentials on the project

application/json
  • callstackobject
    Show properties

    object | null

  • errorstringrequired
Examplejson
{
  "callstack": {},
  "error": "string"
}

500Internal error

application/json
  • callstackobject
    Show properties

    object | null

  • errorstringrequired
Examplejson
{
  "callstack": {},
  "error": "string"
}

503Auth Service or blob storage unavailable

application/json
  • callstackobject
    Show properties

    object | null

  • errorstringrequired
Examplejson
{
  "callstack": {},
  "error": "string"
}