{
    "type": "tag",
    "title": "APIs",
    "canonical": "https://www.dealmobile.co.uk/writing/tag/apis",
    "path": "/writing/tag/apis",
    "url": "https://www.dealmobile.co.uk/writing/tag/apis",
    "markdown": "https://www.dealmobile.co.uk/writing/tag/apis.md",
    "json": "https://www.dealmobile.co.uk/writing/tag/apis.json",
    "feed": "https://www.dealmobile.co.uk/writing/tag/apis.rss",
    "items": [
        {
            "type": "article",
            "title": "Testing an API client without the network",
            "url": "https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network",
            "markdown": "https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network.md",
            "json": "https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network.json",
            "summary": "How the Puzzler PHP SDK signs its requests and turns HTTP errors into exceptions, and how one protected method lets the tests check both with no credentials and no connection.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "Picking the cheapest model that can do the job",
            "url": "https://www.dealmobile.co.uk/writing/picking-the-cheapest-model-that-can-do-the-job",
            "markdown": "https://www.dealmobile.co.uk/writing/picking-the-cheapest-model-that-can-do-the-job.md",
            "json": "https://www.dealmobile.co.uk/writing/picking-the-cheapest-model-that-can-do-the-job.json",
            "summary": "How Mullet sizes up a task, picks the cheapest model that clears a quality floor for it, and carries on when OpenRouter withdraws a model without notice.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "Live coverage on Apple News from PHP",
            "url": "https://www.dealmobile.co.uk/writing/live-coverage-on-apple-news-from-php",
            "markdown": "https://www.dealmobile.co.uk/writing/live-coverage-on-apple-news-from-php.md",
            "json": "https://www.dealmobile.co.uk/writing/live-coverage-on-apple-news-from-php.json",
            "summary": "How the Apple News API library builds Live Coverage articles, the rules it checks before Apple does, and the request metadata that starts and ends the coverage.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "Counting developer activity from git",
            "url": "https://www.dealmobile.co.uk/writing/counting-developer-activity-from-git",
            "markdown": "https://www.dealmobile.co.uk/writing/counting-developer-activity-from-git.md",
            "json": "https://www.dealmobile.co.uk/writing/counting-developer-activity-from-git.json",
            "summary": "How GitHub Auditor counts commits, lines and reviews across many repositories without counting the same work twice, counting lines nobody wrote, or passing off missing data as a quiet week.",
            "published": "2026-10-20"
        },
        {
            "type": "article",
            "title": "Publishing to Apple News from PHP",
            "url": "https://www.dealmobile.co.uk/writing/publishing-to-apple-news-from-php",
            "markdown": "https://www.dealmobile.co.uk/writing/publishing-to-apple-news-from-php.md",
            "json": "https://www.dealmobile.co.uk/writing/publishing-to-apple-news-from-php.json",
            "summary": "What it takes to publish an article to Apple News from PHP, from signing requests and building multipart uploads to the JSON details Apple’s format is strict about.",
            "published": "2026-03-21"
        }
    ]
}