Vai al contenuto

Esempi

Esempi di codice completi per creare, avviare, aggiornare e terminare le attività in curl, Python, Go e JavaScript.

Info

Most examples use the generic template; the tap-actions example below uses alert. Replace hlk_YOUR_KEY with your integration key. See Live Activities for template-specific fields.

curl

Crea attività
curl -X POST https://api.pushward.app/activities \
  -H "Authorization: Bearer hlk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"slug": "my-build", "name": "My Build"}'
Avvia attività
curl -X PATCH https://api.pushward.app/activities/my-build \
  -H "Authorization: Bearer hlk_YOUR_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "state": "ongoing",
    "content": {
      "template": "generic",
      "progress": 0.0,
      "state": "Starting...",
      "icon": "arrow.triangle.branch",
      "accent_color": "cyan"
    }
  }'
Aggiorna l'avanzamento
curl -X PATCH https://api.pushward.app/activities/my-build \
  -H "Authorization: Bearer hlk_YOUR_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "state": "ongoing",
    "content": {
      "template": "generic",
      "progress": 0.75,
      "state": "Running tests...",
      "icon": "arrow.triangle.branch",
      "accent_color": "cyan"
    }
  }'
Termina attività
curl -X PATCH https://api.pushward.app/activities/my-build \
  -H "Authorization: Bearer hlk_YOUR_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "state": "ended",
    "content": {
      "template": "generic",
      "progress": 1.0,
      "state": "Complete",
      "icon": "checkmark.circle.fill",
      "accent_color": "green"
    }
  }'

Tap actions: silent-acknowledge an alert

This example fires an alert Live Activity whose primary button silently POSTs to an acknowledgement webhook (no app launch) and whose secondary button opens the Grafana panel in Safari. See Tap actions for the full schema.

Fire an alert with tap actions
curl -X PATCH https://api.pushward.app/activities/cpu-high \
  -H "Authorization: Bearer hlk_YOUR_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "state": "ongoing",
    "content": {
      "template": "alert",
      "progress": 0.0,
      "state": "CPU usage is 94.2%",
      "icon": "exclamationmark.triangle.fill",
      "subtitle": "Grafana · nas-01",
      "severity": "warning",
      "accent_color": "red",
      "url_action": {
        "url": "https://hooks.example.com/grafana/ack",
        "method": "POST",
        "headers": { "Authorization": "Bearer hooks_xxx" },
        "body": "{\"alert\":\"cpu-high\",\"acked\":true}",
        "title": "Acknowledge",
        "icon": "checkmark.circle"
      },
      "secondary_url_action": {
        "url": "https://grafana.example.com/d/abc123?viewPanel=1",
        "foreground": true,
        "title": "Open panel",
        "icon": "chart.bar"
      }
    }
  }'
💡 Suggerimento

The Acknowledge button fires the HTTP request from the widget process without launching your app — perfect for one-tap pager acknowledgements. The Open panel button opens Safari (because foreground: true) so the user can investigate.

Python

pushward.py
import requests

BASE_URL = "https://api.pushward.app"
TOKEN = "hlk_YOUR_KEY"
HEADERS = {
    "Authorization": f"Bearer {TOKEN}",
    "Content-Type": "application/json",
}

# Create activity
requests.post(f"{BASE_URL}/activities", headers=HEADERS, json={
    "slug": "my-build",
    "name": "My Build",
})

# Start activity
requests.patch(f"{BASE_URL}/activities/my-build", headers=HEADERS, json={
    "state": "ongoing",
    "content": {
        "template": "generic",
        "progress": 0.0,
        "state": "Starting...",
        "icon": "arrow.triangle.branch",
        "accent_color": "cyan",
    },
})

# Update progress
requests.patch(f"{BASE_URL}/activities/my-build", headers=HEADERS, json={
    "state": "ongoing",
    "content": {
        "template": "generic",
        "progress": 0.75,
        "state": "Running tests...",
        "icon": "arrow.triangle.branch",
        "accent_color": "cyan",
    },
})

# End activity
requests.patch(f"{BASE_URL}/activities/my-build", headers=HEADERS, json={
    "state": "ended",
    "content": {
        "template": "generic",
        "progress": 1.0,
        "state": "Complete",
        "icon": "checkmark.circle.fill",
        "accent_color": "green",
    },
})

Go

main.go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

const (
	baseURL = "https://api.pushward.app"
	token   = "hlk_YOUR_KEY"
)

func main() {
	// Create activity
	post("/activities", map[string]any{
		"slug": "my-build",
		"name": "My Build",
	})

	// Start activity
	patch("/activities/my-build", map[string]any{
		"state": "ongoing",
		"content": map[string]any{
			"template":     "generic",
			"progress":     0.0,
			"state":        "Starting...",
			"icon":         "arrow.triangle.branch",
			"accent_color": "cyan",
		},
	})

	// Update progress
	patch("/activities/my-build", map[string]any{
		"state": "ongoing",
		"content": map[string]any{
			"template":     "generic",
			"progress":     0.75,
			"state":        "Running tests...",
			"icon":         "arrow.triangle.branch",
			"accent_color": "cyan",
		},
	})

	// End activity
	patch("/activities/my-build", map[string]any{
		"state": "ended",
		"content": map[string]any{
			"template":     "generic",
			"progress":     1.0,
			"state":        "Complete",
			"icon":         "checkmark.circle.fill",
			"accent_color": "green",
		},
	})
}

func post(path string, body map[string]any) {
	doRequest("POST", path, body)
}

func patch(path string, body map[string]any) {
	doRequest("PATCH", path, body)
}

func doRequest(method, path string, body map[string]any) {
	data, _ := json.Marshal(body)
	req, _ := http.NewRequest(method, baseURL+path, bytes.NewReader(data))
	req.Header.Set("Authorization", "Bearer "+token)
	req.Header.Set("Content-Type", "application/json")
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	defer resp.Body.Close()
	fmt.Printf("%s %s -> %d\n", method, path, resp.StatusCode)
}

JavaScript

pushward.js
const BASE_URL = "https://api.pushward.app";
const TOKEN = "hlk_YOUR_KEY";

const headers = {
  Authorization: `Bearer ${TOKEN}`,
  "Content-Type": "application/json",
};

// Create activity
await fetch(`${BASE_URL}/activities`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    slug: "my-build",
    name: "My Build",
  }),
});

// Start activity
await fetch(`${BASE_URL}/activities/my-build`, {
  method: "PATCH",
  headers,
  body: JSON.stringify({
    state: "ongoing",
    content: {
      template: "generic",
      progress: 0.0,
      state: "Starting...",
      icon: "arrow.triangle.branch",
      accent_color: "cyan",
    },
  }),
});

// Update progress
await fetch(`${BASE_URL}/activities/my-build`, {
  method: "PATCH",
  headers,
  body: JSON.stringify({
    state: "ongoing",
    content: {
      template: "generic",
      progress: 0.75,
      state: "Running tests...",
      icon: "arrow.triangle.branch",
      accent_color: "cyan",
    },
  }),
});

// End activity
await fetch(`${BASE_URL}/activities/my-build`, {
  method: "PATCH",
  headers,
  body: JSON.stringify({
    state: "ended",
    content: {
      template: "generic",
      progress: 1.0,
      state: "Complete",
      icon: "checkmark.circle.fill",
      accent_color: "green",
    },
  }),
});