## Notification service

The AFP notification service lets AFP Transparent platforms receive
notifications upon
[PlatformChildSite](https://developers.google.com/adsense/platforms/reference/rest/v1alpha/accounts.platforms.childAccounts.sites)
approvals - signalling the site is now available in the API.

To receive notifications, implement a server that accepts
POST requests and parses the JSON payload outlined in the [schema](https://developers.google.com/adsense/platforms/transparent/notification-service#schema)
(see [example setup](https://developers.google.com/adsense/platforms/transparent/notification-service#example_setup)). You then need to provide the endpoint URL
to your Strategic Partner Manager to activate the service.

### Schema

The notification payload must adhere to the following schema:

    {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "title": "Notification",
      "type": "object",
      "properties": {
        "platformPublisherId": {
          "type": "string",
          "description": "The unique identifier for the platform publisher."
        },
        "publisherId": {
          "type": "string",
          "description": "The unique identifier for the publisher."
        },
        "platformChildSiteName": {
          "type": "string",
          "description": "The name of the PlatformChildSite the notification refers to (populated for SITE_APPROVAL)."
        },
        "notificationType": {
          "type": "string",
          "enum": ["SITE_APPROVAL"],
          "description": "Type of notification"
        },
      },
      "required": ["platformPublisherId", "publisherId", "notificationType"],
      "additionalProperties": false
    }

More `notificationTypes` and other fields could be added later.

#### Examples

A `SITE_APPROVAL` notification would look like:

    {
      "platformPublisherId" : "pub-123",
      "publisherId" : "pub-456",
      "platformChildSiteName" : "accounts/pub-123/platforms/my-platform/childAccounts/pub-456/sites/child-domain.com",
      "notificationType": "SITE_APPROVAL"
    }

### Example setup

The following is an example of a NodeJS server that logs the contents of a
notification:

    // Import express
    const express = require('express');

    // Create an express application
    const app = express();

    // Middleware to parse JSON bodies
    app.use(express.json());

    // Define a route to receive POST requests
    app.post('/notification', (req, res) => {
        console.log('Received platformPublisherId:', req.body.platformPublisherId)
        console.log('Received publisherId:', req.body.publisherId)
        console.log('Received platformChildSiteName:', req.body.platformChildSiteName)
        console.log('Received notification type', req.body.notificationType)

        // Send a response back to the client
        res.status(200).send('Notification received');
    });

    // Start the server
    const PORT = process.env.PORT || 8080;
    app.listen(PORT, () => {
      console.log(`Server running on port ${PORT}`);
    });

Example endpoint URL: `https://yourdomain.com/your-endpoint`

Verify your endpoint is working by sending a POST request using `curl`:

    curl -X POST https://yourdomain.com/your-endpoint \
         -H "Content-Type: application/json" \
         -d '{"platformPublisherId" : "pub-123", \
              "publisherId" : "pub-456", \
              "platformChildSiteName" : "accounts/pub-123/platforms/my-platform/childAccounts/pub-456/sites/child-domain.com", \
              "notificationType": "SITE_APPROVAL"}'

### Configure robots.txt

Verify the notification service is allowed access to your endpoint. The
notification service respects directives outlined in the
[`robots.txt`](https://www.robotstxt.org/robotstxt.html) file of the root of
your domain, if one exists:

    User-agent: GoogleOther
    Disallow: <ensure your endpoint is not disallowed>