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 | 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"
}
]
}
Carousel Slides¶
{
"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¶
{
"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:
{
"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¶
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.