with Google Ads and Google Cloud Document AI?
Emit new event when a new campaign is created. See the documentation
Emit new event for new leads on a Lead Form. See the documentation
Adds a contact to a specific customer list in Google Ads. Lists typically update in 6 to 12 hours after operation. See the documentation
Create a new customer list in Google Ads. See the documentation
Generates a report from your Google Ads data. See the documentation
Send an event from to Google Ads to track offline conversions. See the documentation
The Google Ads API lets you programmatically manage your Google Ads data and
campaigns. You can use the API to automate common tasks, such as:
You can also use the API to get information about your campaigns, such as:
The Google Ads API is a powerful tool that lets you manage your Google Ads data
and campaigns programmatically. With the API, you can automate common tasks,
such as creating and managing campaigns, adding and removing keywords, and
adjusting bids. You can also use the API to get information about your
campaigns, such as campaign stats, keyword stats, and ad performance.
The Pipedream components interact with Google Ads API through an interal proxy service, which protects Pipedream's developer token.
The component accepts a standard Google Ads API request object with the following structure:
const googleAdsReq = {
method: "get|post|put|delete", // HTTP method
url: "/v18/...", // Google Ads API endpoint path
headers: {
Authorization: `Bearer ${this.googleAds.$auth.oauth_access_token}`,
},
data: {}, // Optional request body for POST/PUT requests
};
To make different API calls while using the proxy:
url
path to match your desired Google Ads API endpointmethod
to match the required HTTP methoddata
fieldExample for a custom query:
const googleAdsReq = {
method: "post",
url: "/v16/customers/1234567890/googleAds:search",
headers: {
Authorization: `Bearer ${this.googleAds.$auth.oauth_access_token}`,
},
data: {
query: "SELECT campaign.id, campaign.name FROM campaign",
},
};
The proxy endpoint will remain the same: https://googleads.m.pipedream.net
To interface with Google Ads via the Connect API Proxy, you need to nest the request like this:
Important notes:
https://googleads.m.pipedream.net
url
param in the body
method
to the Connect Proxy should always be a POST
, since it's actually targeting the Google Ads proxy (you can define the method for the Google Ads request in options.body.method
)const pd = createBackendClient({
apiHost: process.env.API_HOST,
credentials: {
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
},
environment: process.env.ENVIRONMENT,
projectId: process.env.PROJECT_ID,
});
const pdGoogleAdsUrl = "https://googleads.m.pipedream.net";
const resp = await pd.makeProxyRequest(
{
searchParams: {
external_user_id: process.env.EXTERNAL_USER_ID,
account_id: process.env.ACCOUNT_ID,
},
},
{
url: pdGoogleAdsUrl,
options: {
method: "POST",
body: {
url: "/v19/customers:listAccessibleCustomers",
method: "GET",
// data: {} // If you need to send a body with a POST request, define it here
},
},
}
);
https://googleads.m.pipedream.net
curl -X POST "https://api.pipedream.com/v1/connect/{your_project_id}/proxy/{url_safe_base64_encoded_url}?external_user_id={external_user_id}&account_id={apn_xxxxxxx}" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: {development | production}" \
-d '{
"url": "/v19/customers:listAccessibleCustomers",
"method": "GET",
# "data": {} # If you need to send a body with a POST request, define it here
}'
import { axios } from "@pipedream/platform"
export default defineComponent({
props: {
googleAds: { type: "app", app: "google_ads" }
},
async run({ $ }) {
const googleAdsReq = {
method: "get",
url: "/v19/customers:listAccessibleCustomers",
headers: {
"Authorization": `Bearer ${this.googleAds.$auth.oauth_access_token}`,
// "login-customer-id": this.googleAds.$auth.customer_id // optional for this endpoint
}
}
// proxy google ads request
return await axios($, {
url: "https://googleads.m.pipedream.net",
data: googleAdsReq,
})
}
})
import { DocumentProcessorServiceClient } from '@google-cloud/documentai/build/src/v1/index.js';
import { promises as fs } from 'fs';
import { get } from 'https';
import { writeFile } from 'fs/promises';
import { join } from 'path';
export default defineComponent({
props: {
google_cloud_document_ai: {
type: "app",
app: "google_cloud_document_ai",
}
},
async run({ steps, $ }) {
//Sample pdf file to process by Google Document AI API
const url = 'https://www.learningcontainer.com/wp-content/uploads/2019/09/sample-pdf-file.pdf';
const filePath = join('/tmp', 'my_document.pdf');
const downloadFile = async () => {
const res = await new Promise((resolve) => get(url, resolve));
const chunks = [];
for await (const chunk of res) {
chunks.push(chunk);
}
await writeFile(filePath, Buffer.concat(chunks));
console.log(`File downloaded successfully to ${filePath}`);
};
await downloadFile();
const projectId = this.google_cloud_document_ai.$auth.project_id;
const location = this.google_cloud_document_ai.$auth.location;
const processorId = this.google_cloud_document_ai.$auth.processor_id;
// Instantiates a client
// apiEndpoint regions available: eu-documentai.googleapis.com, us-documentai.googleapis.com (Required if using eu based processor)
// const client = new DocumentProcessorServiceClient({apiEndpoint: 'eu-documentai.googleapis.com'});
const client = new DocumentProcessorServiceClient();
async function testRequest() {
// The full resource name of the processor, e.g.:
// projects/project-id/locations/location/processor/processor-id
// You must create new processors in the Cloud Console first
const name = `projects/${projectId}/locations/${location}/processors/${processorId}`;
// Read the file into memory.
const imageFile = await fs.readFile(filePath);
// Convert the image data to a Buffer and base64 encode it.
const encodedImage = Buffer.from(imageFile).toString('base64');
const request = {
name,
rawDocument: {
content: encodedImage,
mimeType: 'application/pdf',
},
};
// Recognizes text entities in the PDF document
const [result] = await client.processDocument(request);
const { document } = result;
// Get all of the document text as one big string
const { text } = document;
// Extract shards from the text field
const getText = textAnchor => {
if (!textAnchor.textSegments || textAnchor.textSegments.length === 0) {
return '';
}
// First shard in document doesn't have startIndex property
const startIndex = textAnchor.textSegments[0].startIndex || 0;
const endIndex = textAnchor.textSegments[0].endIndex;
return text.substring(startIndex, endIndex);
};
// Read the text recognition output from the processor
const [page1] = document.pages;
const { paragraphs } = page1;
let concatenatedText = "";
for (const paragraph of paragraphs) {
const paragraphText = getText(paragraph.layout.textAnchor);
concatenatedText += paragraphText;
}
return concatenatedText;
}
return await testRequest();
}
})