{"openapi":"3.1.0","info":{"title":"FraterTrust API","version":"1.0.0","summary":"API de registros institucionais verificáveis.","description":"Emita, consulte e revogue registros estruturados na organização vinculada à chave de API. O fluxo de PDF selado está disponível na área autenticada.","contact":{"name":"FraterTech","url":"https://www.fratertech.com.br"}},"externalDocs":{"description":"Documentação para desenvolvedores","url":"https://fratertrust.fratertech.com.br/documentacao-api"},"servers":[{"url":"https://fratertrust.fratertech.com.br","description":"Produção"}],"tags":[{"name":"Operação","description":"Disponibilidade e contrato da API."},{"name":"Registros","description":"Ciclo de vida dos registros institucionais verificáveis."}],"paths":{"/v1/health":{"get":{"tags":["Operação"],"operationId":"getApiHealth","summary":"Consultar disponibilidade","security":[],"responses":{"200":{"description":"API disponível.","content":{"application/json":{"schema":{"type":"object","required":["status","service","version"],"properties":{"status":{"type":"string","const":"ok"},"service":{"type":"string","const":"fratertrust-api"},"version":{"type":"string","example":"1.0.0"},"timestamp":{"type":"string","format":"date-time"}}}}}}}}},"/v1/openapi.json":{"get":{"tags":["Operação"],"operationId":"getOpenApiDocument","summary":"Obter o contrato OpenAPI","security":[],"responses":{"200":{"description":"Documento OpenAPI 3.1.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/credentials":{"post":{"tags":["Registros"],"operationId":"issueCredential","summary":"Emitir um registro verificável","description":"Cria um registro estruturado e registra sua prova SHA-256 na organização autenticada.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueCredentialRequest"}}}},"responses":{"201":{"description":"Registro verificável emitido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/credentials/{code}":{"get":{"tags":["Registros"],"operationId":"getCredential","summary":"Consultar um registro verificável","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/CredentialCode"}],"responses":{"200":{"description":"Registro localizado na organização autenticada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/credentials/{code}/revoke":{"post":{"tags":["Registros"],"operationId":"revokeCredential","summary":"Revogar um registro verificável","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/CredentialCode"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["reason"],"properties":{"reason":{"type":"string","minLength":3,"maxLength":500,"example":"Vínculo institucional encerrado."}}}}}},"responses":{"200":{"description":"Registro revogado.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Credential"},{"type":"object","properties":{"revoked":{"type":"boolean","const":true}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"FraterTrust API key","description":"Chave no formato ft_live_ ou ft_test_."}},"parameters":{"CredentialCode":{"name":"code","in":"path","required":true,"description":"Código público do registro verificável.","schema":{"type":"string","pattern":"^FT-[0-9]{4}-[A-F0-9]{16}$","example":"FT-2026-7E26A4F9183B4C10"}}},"schemas":{"CredentialAttribute":{"type":"object","additionalProperties":false,"required":["label","value"],"properties":{"label":{"type":"string","maxLength":100},"value":{"type":"string","maxLength":500}}},"IssueCredentialRequest":{"type":"object","additionalProperties":false,"required":["template","holder","purpose"],"properties":{"template":{"type":"string","description":"Slug ou UUID de um modelo ativo.","example":"membership"},"holder":{"type":"object","additionalProperties":false,"required":["name","identifier"],"properties":{"name":{"type":"string","minLength":2,"maxLength":180},"identifier":{"type":"string","minLength":4,"maxLength":160}}},"purpose":{"type":"string","minLength":3,"maxLength":500},"expiresAt":{"type":["string","null"],"format":"date-time"},"attributes":{"type":"array","maxItems":25,"items":{"$ref":"#/components/schemas/CredentialAttribute"}}}},"Credential":{"type":"object","required":["id","type","status","holder","issuer","issuedAt","purpose","attributes","proof","verificationUrl"],"properties":{"id":{"type":"string","example":"FT-2026-7E26A4F9183B4C10"},"type":{"type":"string","example":"Vínculo institucional"},"status":{"type":"string","enum":["valid","revoked","expired","suspended"]},"holder":{"type":"object","properties":{"name":{"type":"string"},"identifierMasked":{"type":"string"}}},"issuer":{"type":"object","properties":{"organization":{"type":"string"},"name":{"type":"string"}}},"issuedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"purpose":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/components/schemas/CredentialAttribute"}},"proof":{"type":"object","properties":{"method":{"type":"string","const":"sha256"},"documentHash":{"type":"string"}}},"verificationUrl":{"type":"string","format":"uri"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}}}},"responses":{"BadRequest":{"description":"Requisição inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Chave ausente, revogada ou sem o escopo necessário.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Registro não localizado na organização autenticada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}