Java 17 SDK for the Portal REST API.
// settings.gradle.kts
dependencyResolutionManagement {
repositories { maven { url = uri("https://jitpack.io") } }
}
// build.gradle.kts
dependencies {
implementation("com.github.PortalTechnologiesInc:java-sdk:0.4.0")
}Choose how you want to receive async results:
// Manual polling — you call pollUntilComplete() yourself, no background threads
PortalClient client = new PortalClient(
PortalClientConfig.create("http://localhost:3000", "token")
);
// Auto-polling — background scheduler, just use done()
PortalClient client = new PortalClient(
PortalClientConfig.create("http://localhost:3000", "token")
.autoPolling(500) // poll every 500ms
);
// Webhooks — portal-rest POSTs to your server, just use done()
PortalClient client = new PortalClient(
PortalClientConfig.create("http://localhost:3000", "token")
.webhookSecret("my-secret")
);All async methods return AsyncOperation<T> with streamId (available immediately)
and done (CompletableFuture<T> that resolves when the operation completes).
AsyncOperation<InvoiceStatus> op = client.requestSinglePayment(
mainKey, List.of(),
new SinglePaymentRequestContent("Coffee", 1000, Currency.MILLISATS, null, null, null)
);
// blocks until paid/rejected/timeout
InvoiceStatus result = client.pollUntilComplete(op, PollOptions.defaults().timeoutMs(60_000));
System.out.println(result.status); // "paid", "timeout", "user_rejected", ...// client configured with .autoPolling(500)
AsyncOperation<InvoiceStatus> op = client.requestSinglePayment(...);
op.done().thenAccept(result -> System.out.println(result.status));// client configured with .webhookSecret("my-secret")
AsyncOperation<InvoiceStatus> op = client.requestSinglePayment(...);
op.done().thenAccept(result -> System.out.println(result.status));
// in your HTTP server's POST /webhook handler:
client.deliverWebhookPayload(rawBody, request.getHeader("X-Portal-Signature"));| Method | Resolves to |
|---|---|
requestSinglePayment(mainKey, subkeys, content) |
AsyncOperation<InvoiceStatus> |
requestPaymentRaw(mainKey, subkeys, content) |
AsyncOperation<InvoiceStatus> |
requestRecurringPayment(mainKey, subkeys, content) |
AsyncOperation<RecurringPaymentResponseContent> |
requestInvoice(recipientKey, subkeys, params) |
AsyncOperation<InvoicePaymentResponse> |
requestCashu(recipientKey, subkeys, mintUrl, unit, amount) |
AsyncOperation<CashuResponseStatus> |
authenticateKey(mainKey, subkeys) |
AsyncOperation<AuthResponseData> |
newKeyHandshakeUrl(staticToken, noRequest) |
AsyncOperation<KeyHandshakeResult> |
health(), version(), info(), fetchProfile(), payInvoice(),
closeRecurringPayment(), issueJwt(), verifyJwt(), addRelay(), removeRelay(),
mintCashu(), burnCashu(), sendCashuDirect(), calculateNextOccurrence(),
fetchNip05Profile(), getWalletInfo()
Java SDK major.minor must match the portal-rest (sdk-daemon) version.
| Java SDK | sdk-daemon |
|---|---|
| 0.4.x | 0.4.x |
| 0.3.x | 0.3.x |