Create a quote grant request
Before a client can call most of the Open Payments APIs, it must receive a grant from the appropriate authorization server.
The snippets below enable a client to request a grant for a quote. The request to the authorization server must indicate the quote access type the and actions the client wants to take at the resource server.
Before you begin
Section titled “Before you begin”We recommend creating a wallet account on the test wallet. Creating an account allows you to test your client against the Open Payments APIs by using an ILP-enabled wallet funded with play money.
Request a quote grant
Section titled “Request a quote grant”Initial configuration
If you’re using JavaScript, only do the first step.
- Add
"type": "module"topackage.json. - Add the following to
tsconfig.json{"compilerOptions": {"target": "ES2022","module": "ES2022"}}
Import dependencies
import { createAuthenticatedClient } from "@interledger/open-payments"; Copied! Initialize Open Payments client
const client = await createAuthenticatedClient({
walletAddressUrl: WALLET_ADDRESS,
privateKey: PRIVATE_KEY_PATH,
keyId: KEY_ID,
}); Copied! Get wallet address information
const walletAddress = await client.walletAddress.get({
url: WALLET_ADDRESS,
}); Copied! Request quote grant
const grant = await client.grant.request(
{
url: walletAddress.authServer,
},
{
access_token: {
access: [
{
type: "quote",
actions: ["create", "read", "read-all"],
},
],
},
},
); Copied! Check grant state
if (isPendingGrant(grant)) {
throw new Error("Expected non-interactive grant");
} Copied! Output
console.log("QUOTE_ACCESS_TOKEN =", grant.access_token.value);
console.log("QUOTE_ACCESS_TOKEN_MANAGE_URL = ", grant.access_token.manage); Copied! For TypeScript, run tsx path/to/directory/index.ts. View full TS source
For JavaScript, run node path/to/directory/index.js. View full JS source
Import dependencies
use open_payments::client::api::UnauthenticatedResources;
use open_payments::client::AuthenticatedResources;
use open_payments::snippets::utils::{create_authenticated_client, get_env_var, load_env};
use open_payments::types::{
auth::{AccessItem, AccessTokenRequest, GrantRequest, QuoteAction},
GrantResponse,
}; Copied! Initialize Open Payments client
// Authenticated client can be also used for unauthenticated resources
let client = create_authenticated_client()?; Copied! Get wallet address information
let wallet_address_url = get_env_var("WALLET_ADDRESS_URL")?;
let wallet_address = client.wallet_address().get(&wallet_address_url).await?; Copied! Request quote grant
let grant_request = GrantRequest::new(
AccessTokenRequest {
access: vec![AccessItem::Quote {
actions: vec![QuoteAction::Create, QuoteAction::Read, QuoteAction::ReadAll],
}],
},
None,
);
println!(
"Grant request JSON: {}",
serde_json::to_string_pretty(&grant_request)?
);
let response = client
.grant()
.request(&wallet_address.auth_server, &grant_request)
.await?; Copied! Output
match response {
GrantResponse::WithToken { access_token, .. } => {
println!("Received access token: {:#?}", access_token.value);
println!(
"Received access token manage URL: {:#?}",
access_token.manage
);
}
GrantResponse::WithInteraction { .. } => {
unreachable!("Interaction not required for quotes");
}
} Copied! Import dependencies
use OpenPayments\AuthClient;
use OpenPayments\Config\Config; Copied! Initialize Open Payments client
$config = new Config($WALLET_ADDRESS, $PRIVATE_KEY, $KEY_ID);
$opClient = new AuthClient($config); Copied! Get wallet address information
$wallet = $opClient->walletAddress()->get([
"url" => $config->getWalletAddressUrl(),
]); Copied! Request quote grant
$grant = $opClient->grant()->request(
[
"url" => $wallet->authServer,
],
[
"access_token" => [
"access" => [
[
"type" => "quote",
"actions" => ["create", "read", "read-all"],
],
],
],
"client" => $config->getWalletAddressUrl(),
],
); Copied! Check grant state
if ($grant instanceof \OpenPayments\Models\PendingGrant) {
throw new \Error("Expected non-interactive grant");
} Copied! Output
$output->writeln("QUOTE_ACCESS_TOKEN: " . $grant->access_token->value);
$output->writeln(
"QUOTE_ACCESS_TOKEN_MANAGE_URL: " . $grant->access_token->manage,
); Copied!