Skip to content

Content Lifecycle

Content in AMP moves through a defined lifecycle from initial generation to post-publication optimization.

Lifecycle Overview

stateDiagram-v2
    [*] --> draft: Generated
    draft --> pending_review: Approval Required
    draft --> approved: Auto-Approved
    pending_review --> approved: Approved
    pending_review --> rejected: Rejected
    rejected --> draft: Regenerated
    approved --> scheduled: Scheduled
    scheduled --> published: Published
    published --> [*]

Content States

State Description
draft Just generated, not yet processed
pending_review Waiting for human approval
approved Ready for scheduling
rejected Failed review, may be regenerated
scheduled Queued for publishing at specific time
published Live on the platform
failed Publishing failed
archived Removed from active circulation

Content Structure

Every piece of content follows a consistent structure:

{
  "id": "cnt_5zN1pSsU7yA9vW6x",
  "mission_id": "msn_2xK9mPqR4vN8sT3w",
  "tenant_id": "tnt_xxx",

  "platform": "twitter",
  "type": "thread",
  "status": "scheduled",

  "copy": {
    "primary": "Main post text...",
    "headline": null,
    "hook": "Opening hook line",
    "body": "Main body content",
    "cta": "Learn more →",
    "hashtags": ["#DevTools", "#API"],
    "mentions": ["@relevant_account"],
    "alt_text": "Description for accessibility",
    "thread_parts": [
      "First tweet in thread...",
      "Second tweet...",
      "Final tweet with CTA"
    ],
    "first_comment": null,
    "variations": []
  },

  "visuals": [
    {
      "type": "image",
      "url": "https://cdn.amp.dev/assets/cnt_xxx/hero.png",
      "thumbnail_url": "https://cdn.amp.dev/assets/cnt_xxx/hero_thumb.png",
      "alt_text": "API workflow diagram",
      "dimensions": {"width": 1200, "height": 675},
      "format": "png",
      "file_size_bytes": 245000,
      "position": 1
    }
  ],

  "metadata": {
    "campaign": "Q1 Developer Outreach",
    "topic": "API Design",
    "pillar": "Thought Leadership",
    "tags": ["api", "developer-experience"],
    "language": "en",
    "tone": "professional",
    "target_audience": "software developers",
    "generation_model": "claude-3-opus",
    "generation_cost_cents": 12,
    "confidence_score": 0.92
  },

  "scheduling": {
    "scheduled_for": "2024-01-16T09:00:00-05:00",
    "timezone": "America/New_York",
    "optimal_time_used": true
  },

  "publishing": {
    "published_at": null,
    "platform_post_id": null,
    "platform_url": null,
    "metricool_post_id": "mc_12345"
  },

  "review": {
    "required": false,
    "reviewed_by": null,
    "reviewed_at": null,
    "notes": null
  },

  "version": 1,
  "parent_id": null,

  "created_at": "2024-01-15T10:45:00Z",
  "updated_at": "2024-01-15T10:45:00Z"
}

Content Types

AMP supports various content formats:

Type Platforms Description
post All Single post with text and optional media
thread Twitter, Threads Multi-part connected posts
carousel Instagram, LinkedIn Multiple images/slides
reel Instagram Short-form video
story Instagram, Facebook Ephemeral 24-hour content
article LinkedIn, Blog Long-form content
video TikTok, YouTube Video content
poll Twitter, LinkedIn Interactive polls

Type Selection

The strategy stage selects content types based on:

  • Platform capabilities
  • Objective alignment
  • Historical performance
  • Content variety requirements

Copy Components

Primary Copy

The main text content visible to users.

{
  "copy": {
    "primary": "APIs shouldn't feel like puzzles. We rebuilt ours from the ground up with developer experience in mind."
  }
}

Thread Parts

For multi-part content:

{
  "copy": {
    "thread_parts": [
      "1/ Here's what we learned rebuilding our API from scratch...",
      "2/ First, we audited every endpoint. We had 47. Developers were confused.",
      "3/ We consolidated to 12 core endpoints. Each does one thing well.",
      "4/ The result? 73% fewer support tickets. Sometimes less is more."
    ]
  }
}

Hashtags and Mentions

{
  "copy": {
    "hashtags": ["#DevEx", "#API", "#DeveloperExperience"],
    "mentions": ["@stripe", "@github"]
  }
}

Hashtags are platform-optimized:

  • Twitter: 2-3 hashtags, mid-post or end
  • Instagram: 20-30 hashtags in first comment
  • LinkedIn: 3-5 hashtags at end

Variations

A/B test variations:

{
  "copy": {
    "primary": "Original copy...",
    "variations": [
      {
        "id": "var_a",
        "primary": "Variation A copy...",
        "test_weight": 0.5
      }
    ]
  }
}

Visual Assets

Image Assets

{
  "visuals": [
    {
      "type": "image",
      "url": "https://cdn.amp.dev/assets/cnt_xxx/hero.png",
      "alt_text": "Diagram showing API request flow",
      "dimensions": {"width": 1200, "height": 675},
      "format": "png"
    }
  ]
}
{
  "visuals": [
    {
      "type": "carousel_slide",
      "position": 1,
      "url": "https://cdn.amp.dev/assets/cnt_xxx/slide1.png"
    },
    {
      "type": "carousel_slide",
      "position": 2,
      "url": "https://cdn.amp.dev/assets/cnt_xxx/slide2.png"
    }
  ]
}

Video Content

{
  "visuals": [
    {
      "type": "video",
      "url": "https://cdn.amp.dev/assets/cnt_xxx/video.mp4",
      "thumbnail_url": "https://cdn.amp.dev/assets/cnt_xxx/thumb.jpg",
      "duration_seconds": 45,
      "dimensions": {"width": 1080, "height": 1920}
    }
  ]
}

Content Review

Review Workflow

When require_approval is enabled:

sequenceDiagram
    participant Pipeline
    participant Content
    participant Reviewer
    participant Publisher

    Pipeline->>Content: Generate
    Content->>Content: Status: pending_review
    Content->>Reviewer: Notification

    alt Approved
        Reviewer->>Content: Approve
        Content->>Content: Status: approved
        Content->>Publisher: Schedule
    else Rejected
        Reviewer->>Content: Reject + Feedback
        Content->>Content: Status: rejected
        Content->>Pipeline: Regenerate Request
        Pipeline->>Content: New Version
    end

Approving Content

curl -X POST https://api.amp.dev/v1/content/cnt_xxx/approve \
  -H "Authorization: Bearer $AMP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "notes": "Good tone, approved for publishing"
  }'

Rejecting Content

curl -X POST https://api.amp.dev/v1/content/cnt_xxx/reject \
  -H "Authorization: Bearer $AMP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Tone too casual for LinkedIn audience",
    "feedback": "Use more professional language, remove emoji",
    "regenerate": true
  }'

Scheduling

Optimal Time Selection

AMP can automatically select optimal posting times:

{
  "scheduling": {
    "use_optimal_time": true,
    "timezone": "America/New_York",
    "earliest_time": "08:00",
    "latest_time": "20:00"
  }
}

Optimal times are based on:

  • Historical engagement patterns
  • Platform-specific data
  • Audience timezone distribution

Manual Scheduling

curl -X PUT https://api.amp.dev/v1/content/cnt_xxx/schedule \
  -H "Authorization: Bearer $AMP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "scheduled_for": "2024-01-17T14:00:00-05:00"
  }'

Rescheduling

curl -X PUT https://api.amp.dev/v1/content/cnt_xxx/reschedule \
  -H "Authorization: Bearer $AMP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "scheduled_for": "2024-01-18T10:00:00-05:00",
    "reason": "Avoiding conflict with company announcement"
  }'

Publishing

Publishing Flow

sequenceDiagram
    participant Scheduler
    participant AMP
    participant Metricool
    participant Platform

    Scheduler->>AMP: Time to publish
    AMP->>AMP: Validate content
    AMP->>Metricool: Submit post
    Metricool->>Platform: Publish
    Platform-->>Metricool: Post ID
    Metricool-->>AMP: Confirmation
    AMP->>AMP: Status: published

Publishing Metadata

After publishing:

{
  "publishing": {
    "published_at": "2024-01-16T09:00:15Z",
    "platform_post_id": "1747293847293847",
    "platform_url": "https://twitter.com/yourbrand/status/1747293847293847",
    "metricool_post_id": "mc_12345"
  }
}

Content Versioning

Content can be regenerated, creating new versions:

{
  "id": "cnt_new_version",
  "parent_id": "cnt_original",
  "version": 2,
  "metadata": {
    "regeneration_reason": "Rejected - tone adjustment needed"
  }
}

Version History

curl https://api.amp.dev/v1/content/cnt_xxx/versions \
  -H "Authorization: Bearer $AMP_API_KEY"
{
  "versions": [
    {
      "id": "cnt_xxx_v1",
      "version": 1,
      "status": "rejected",
      "created_at": "2024-01-15T10:00:00Z"
    },
    {
      "id": "cnt_xxx_v2",
      "version": 2,
      "status": "published",
      "created_at": "2024-01-15T11:00:00Z"
    }
  ]
}

Analytics Integration

Published content automatically tracks performance:

curl https://api.amp.dev/v1/content/cnt_xxx/analytics \
  -H "Authorization: Bearer $AMP_API_KEY"
{
  "content_id": "cnt_xxx",
  "platform": "twitter",
  "metrics": {
    "impressions": 4521,
    "engagements": 187,
    "engagement_rate": 4.14,
    "likes": 142,
    "comments": 23,
    "shares": 22,
    "link_clicks": 45
  },
  "collected_at": "2024-01-17T10:00:00Z"
}

Content Operations

Preview Content

curl https://api.amp.dev/v1/content/cnt_xxx/preview \
  -H "Authorization: Bearer $AMP_API_KEY"

Returns a rendered preview URL showing how content will appear.

Duplicate Content

curl -X POST https://api.amp.dev/v1/content/cnt_xxx/duplicate \
  -H "Authorization: Bearer $AMP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "target_platform": "linkedin",
    "adapt_copy": true
  }'

Archive Content

curl -X POST https://api.amp.dev/v1/content/cnt_xxx/archive \
  -H "Authorization: Bearer $AMP_API_KEY"

Archived content is hidden from default queries but retained for analytics.