If you look at the description of the Invoice
object, you will notice that some of its fields are marked as expandable. For example, the customer
field of Invoice
is an expandable Customer
object. What this means is that the field represents another resource object stored elsewhere. By default, only the id
value of the Customer
sub-resource is fetched when you fetch the Invoice
object. You can use this id
to retrieve the sub-resource using the find()
function for that object type in a separate API call. However, you also have the option to expand the sub-resource, which means that all of its data will be included in the main resource as well as its id
value.
The find()
function for each resource type has an options
parameter that comes after the id
that you want to fetch. One of the options is an expand
array that lists the names of all fields that you want to expand when you fetch the main object.
The sub-resources may have other nested sub-resources of their own. Supply a "path" to expand these nested fields using the familiar object dot notation. For example, to expand the Tokens
field of a Customer
in a Transaction
, you can set expand
to customer.tokens
when you fetch the Transaction
object. This will first expand the transaction's customer
field, and then the Customer
object's tokens
field.
curl https://api.processout.com/invoices/iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4 \
-u test-proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x:key_sandbox_mah31RDFqcDxmaS7MvhDbJfDJvjtsFTB \
--data-urlencode expand[]=customer
var ProcessOut = require("processout");
var client = new ProcessOut(
"test-proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"key_sandbox_mah31RDFqcDxmaS7MvhDbJfDJvjtsFTB");
client.newInvoice().find("iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4", {
expand: ["tokens"]
}).then(
function(invoice) {
// Invoice was fetched
}, function(err) {
// An error occured
});
import processout
client = processout.ProcessOut(
"test-proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"key_sandbox_mah31RDFqcDxmaS7MvhDbJfDJvjtsFTB")
customer = client.new_invoice().find("iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4", {
"expand": ["customer"]
})
require "processout"
client = ProcessOut::Client.new(
"test-proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"key_sandbox_mah31RDFqcDxmaS7MvhDbJfDJvjtsFTB")
customer = client.invoice.find("iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4", {
expand: ["customer"]
})
<?php
$client = new \ProcessOut\ProcessOut(
"test-proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"key_sandbox_mah31RDFqcDxmaS7MvhDbJfDJvjtsFTB");
$customer = $client->newInvoice()->find("iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4", array(
"expand" => array("customer")
));
import "github.com/processout/processout-go"
var client = processout.New(
"test-proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"key_sandbox_mah31RDFqcDxmaS7MvhDbJfDJvjtsFTB",
)
cust, err := client.NewInvoice().Find("iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4",
processout.InvoiceFindParameters{
Options: &processout.Options{
Expand: []string{"customer"},
}),
})
If you compare the response to the one generated without expanding the customer
field, you can see that both the full details of the customer and the customer_id
are now included as separate fields, while the rest of the Invoice
is the same as before.
{
"invoice": {
"id": "iv_0kJ1i4d06uViosJjCKpUHzKeauffMom4",
"project_id": "proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"subscription_id": null,
"customer": {
"id": "cust_CgdhFgj5QEv5I8dx6tHxVVrgxBDDzAgc",
"project_id": "proj_gAO1Uu0ysZJvDuUpOGPkUBeE3pGalk3x",
"tokens": null,
"subscriptions": null,
"transactions": null,
"balance": "0",
"currency": "AUD",
"email": "[email protected]",
"first_name": "John",
"last_name": "Smith",
"address1": "999 Letsby Avenue",
.
.
},
"customer_id": "cust_CgdhFgj5QEv5I8dx6tHxVVrgxBDDzAgc",
"token_id": null,
"details": null,
.
.
}