389 lines
12 KiB
Markdown
389 lines
12 KiB
Markdown
---
|
|
name: threads-api
|
|
description: Threads API Documentation
|
|
---
|
|
|
|
# Threads API Skill
|
|
|
|
Comprehensive assistance with Meta's Threads API development for building applications that integrate with the Threads social platform.
|
|
|
|
## When to Use This Skill
|
|
|
|
This skill should be triggered when you are:
|
|
- **Building Threads integrations** - Creating apps that post to or read from Threads
|
|
- **Implementing authentication** - Setting up OAuth flows for Threads API access
|
|
- **Working with media uploads** - Uploading images, videos, or carousel posts to Threads
|
|
- **Managing user content** - Publishing, retrieving, or managing Threads posts
|
|
- **Fetching analytics** - Retrieving insights and metrics for Threads content
|
|
- **Handling webhooks** - Processing real-time updates from Threads
|
|
- **Troubleshooting API errors** - Debugging authentication, rate limits, or API responses
|
|
- **Reading Threads profiles** - Fetching user profile data and posts
|
|
|
|
## Quick Reference
|
|
|
|
### Authentication - Getting an Access Token
|
|
|
|
```javascript
|
|
// Step 1: Redirect user to authorization endpoint
|
|
const authUrl = `https://threads.net/oauth/authorize?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&scope=threads_basic,threads_content_publish&response_type=code`;
|
|
|
|
// Step 2: Exchange authorization code for access token
|
|
const response = await fetch('https://graph.threads.net/oauth/access_token', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
body: new URLSearchParams({
|
|
client_id: CLIENT_ID,
|
|
client_secret: CLIENT_SECRET,
|
|
grant_type: 'authorization_code',
|
|
redirect_uri: REDIRECT_URI,
|
|
code: authorizationCode
|
|
})
|
|
});
|
|
|
|
const { access_token } = await response.json();
|
|
```
|
|
|
|
### Publishing a Text Post
|
|
|
|
```javascript
|
|
// Create a simple text post
|
|
const response = await fetch(`https://graph.threads.net/v1.0/me/threads`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': `Bearer ${accessToken}`
|
|
},
|
|
body: JSON.stringify({
|
|
media_type: 'TEXT',
|
|
text: 'Hello from Threads API! 🎉'
|
|
})
|
|
});
|
|
|
|
const data = await response.json();
|
|
console.log('Post ID:', data.id);
|
|
```
|
|
|
|
### Publishing an Image Post
|
|
|
|
```python
|
|
import requests
|
|
|
|
# Upload and publish an image
|
|
url = "https://graph.threads.net/v1.0/me/threads"
|
|
headers = {"Authorization": f"Bearer {access_token}"}
|
|
|
|
data = {
|
|
"media_type": "IMAGE",
|
|
"image_url": "https://example.com/image.jpg",
|
|
"text": "Check out this image! #API"
|
|
}
|
|
|
|
response = requests.post(url, headers=headers, json=data)
|
|
post_id = response.json()["id"]
|
|
print(f"Posted image with ID: {post_id}")
|
|
```
|
|
|
|
### Publishing a Video Post
|
|
|
|
```javascript
|
|
// Step 1: Create a video container
|
|
const container = await fetch(`https://graph.threads.net/v1.0/me/threads`, {
|
|
method: 'POST',
|
|
headers: { 'Authorization': `Bearer ${accessToken}` },
|
|
body: JSON.stringify({
|
|
media_type: 'VIDEO',
|
|
video_url: 'https://example.com/video.mp4',
|
|
text: 'Check out this video!'
|
|
})
|
|
});
|
|
|
|
const { id: containerId } = await container.json();
|
|
|
|
// Step 2: Publish the container
|
|
await fetch(`https://graph.threads.net/v1.0/me/threads_publish`, {
|
|
method: 'POST',
|
|
headers: { 'Authorization': `Bearer ${accessToken}` },
|
|
body: JSON.stringify({ creation_id: containerId })
|
|
});
|
|
```
|
|
|
|
### Fetching User Profile
|
|
|
|
```python
|
|
import requests
|
|
|
|
# Get authenticated user's profile
|
|
url = f"https://graph.threads.net/v1.0/me"
|
|
headers = {"Authorization": f"Bearer {access_token}"}
|
|
params = {
|
|
"fields": "id,username,name,threads_profile_picture_url,threads_biography"
|
|
}
|
|
|
|
response = requests.get(url, headers=headers, params=params)
|
|
profile = response.json()
|
|
|
|
print(f"Username: {profile['username']}")
|
|
print(f"Bio: {profile['threads_biography']}")
|
|
```
|
|
|
|
### Fetching User's Threads
|
|
|
|
```javascript
|
|
// Get user's recent threads with pagination
|
|
const response = await fetch(
|
|
`https://graph.threads.net/v1.0/me/threads?fields=id,text,timestamp,media_url&limit=25`,
|
|
{
|
|
headers: { 'Authorization': `Bearer ${accessToken}` }
|
|
}
|
|
);
|
|
|
|
const { data, paging } = await response.json();
|
|
data.forEach(thread => {
|
|
console.log(`${thread.timestamp}: ${thread.text}`);
|
|
});
|
|
|
|
// Use paging.next for next page
|
|
```
|
|
|
|
### Publishing a Carousel Post
|
|
|
|
```python
|
|
import requests
|
|
|
|
# Create a carousel with multiple images
|
|
url = "https://graph.threads.net/v1.0/me/threads"
|
|
headers = {"Authorization": f"Bearer {access_token}"}
|
|
|
|
data = {
|
|
"media_type": "CAROUSEL",
|
|
"children": [
|
|
{"media_type": "IMAGE", "image_url": "https://example.com/img1.jpg"},
|
|
{"media_type": "IMAGE", "image_url": "https://example.com/img2.jpg"},
|
|
{"media_type": "IMAGE", "image_url": "https://example.com/img3.jpg"}
|
|
],
|
|
"text": "Swipe through these images! 📸"
|
|
}
|
|
|
|
response = requests.post(url, headers=headers, json=data)
|
|
carousel_id = response.json()["id"]
|
|
```
|
|
|
|
### Retrieving Insights (Analytics)
|
|
|
|
```javascript
|
|
// Get insights for a specific thread
|
|
const threadId = '123456789';
|
|
const response = await fetch(
|
|
`https://graph.threads.net/v1.0/${threadId}/insights?metric=views,likes,replies,reposts`,
|
|
{
|
|
headers: { 'Authorization': `Bearer ${accessToken}` }
|
|
}
|
|
);
|
|
|
|
const { data } = await response.json();
|
|
data.forEach(metric => {
|
|
console.log(`${metric.name}: ${metric.values[0].value}`);
|
|
});
|
|
```
|
|
|
|
### Error Handling Pattern
|
|
|
|
```python
|
|
import requests
|
|
|
|
def make_threads_request(url, access_token, method='GET', **kwargs):
|
|
"""Robust error handling for Threads API requests"""
|
|
headers = kwargs.pop('headers', {})
|
|
headers['Authorization'] = f"Bearer {access_token}"
|
|
|
|
try:
|
|
response = requests.request(method, url, headers=headers, **kwargs)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
|
|
except requests.exceptions.HTTPError as e:
|
|
error_data = e.response.json()
|
|
error_code = error_data.get('error', {}).get('code')
|
|
error_msg = error_data.get('error', {}).get('message')
|
|
|
|
if error_code == 190:
|
|
raise Exception(f"Invalid access token: {error_msg}")
|
|
elif error_code == 32:
|
|
raise Exception(f"Rate limit exceeded: {error_msg}")
|
|
else:
|
|
raise Exception(f"API Error {error_code}: {error_msg}")
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
raise Exception(f"Network error: {str(e)}")
|
|
```
|
|
|
|
## Key Concepts
|
|
|
|
### Access Tokens and Permissions
|
|
- **Access Tokens**: OAuth 2.0 tokens required for all API requests
|
|
- **Scopes**: Define what your app can access (e.g., `threads_basic`, `threads_content_publish`, `threads_manage_insights`)
|
|
- **Token Expiration**: Long-lived tokens (60 days) and refresh tokens for extended access
|
|
|
|
### Media Types
|
|
- **TEXT**: Simple text posts
|
|
- **IMAGE**: Single image with optional caption
|
|
- **VIDEO**: Single video with optional caption
|
|
- **CAROUSEL**: Multiple images or videos in a swipeable format
|
|
|
|
### Publishing Flow
|
|
1. **Container Creation**: Create a media container with content
|
|
2. **Publishing**: Publish the container to make it visible
|
|
3. **Two-stage process**: Required for videos and carousels to allow processing time
|
|
|
|
### Rate Limits
|
|
- Rate limits vary by endpoint and access level
|
|
- Standard rate limit: 200 calls per hour per user
|
|
- Monitor `X-Business-Use-Case-Usage` header in responses
|
|
- Implement exponential backoff for rate limit errors
|
|
|
|
### Webhooks
|
|
- Real-time notifications for events like mentions, replies, or new followers
|
|
- Requires HTTPS endpoint for receiving notifications
|
|
- Must validate webhook signatures for security
|
|
|
|
## Reference Files
|
|
|
|
This skill includes comprehensive documentation in `references/`:
|
|
|
|
- **other.md** - Complete Threads API documentation including:
|
|
- Authentication and authorization flows
|
|
- API endpoints reference
|
|
- Request/response formats
|
|
- Error codes and troubleshooting
|
|
- Best practices and guidelines
|
|
|
|
Use the skill's reference files when you need detailed information about specific API endpoints, parameters, or advanced features.
|
|
|
|
## Working with This Skill
|
|
|
|
### For Beginners
|
|
Start by understanding the authentication flow - this is the foundation of all Threads API integrations. Focus on:
|
|
1. Setting up your Meta developer account and app
|
|
2. Implementing OAuth 2.0 authorization
|
|
3. Making your first API request to fetch user profile
|
|
4. Publishing a simple text post
|
|
|
|
### For Intermediate Users
|
|
Build on the basics by exploring:
|
|
1. Media uploads (images and videos)
|
|
2. Carousel posts for multi-image content
|
|
3. Webhook integration for real-time updates
|
|
4. Error handling and retry logic
|
|
5. Rate limit management
|
|
|
|
### For Advanced Users
|
|
Optimize your integration with:
|
|
1. Insights and analytics data
|
|
2. Batch operations for efficiency
|
|
3. Advanced content scheduling
|
|
4. Custom webhook event processing
|
|
5. Multi-account management
|
|
|
|
### Navigation Tips
|
|
- **Quick Reference**: Use the code examples above for common tasks
|
|
- **Reference Files**: Dive into `references/other.md` for complete API documentation
|
|
- **Authentication First**: Always start with proper authentication setup
|
|
- **Test in Sandbox**: Use Meta's test users and sandbox environment during development
|
|
|
|
## Common Workflows
|
|
|
|
### Complete Post Publishing Flow
|
|
1. Obtain access token via OAuth flow
|
|
2. Create media container (if using images/videos)
|
|
3. Wait for container processing (for videos)
|
|
4. Publish the container
|
|
5. Retrieve post ID and insights
|
|
|
|
### User Data Retrieval Flow
|
|
1. Authenticate user
|
|
2. Fetch user profile with required fields
|
|
3. Retrieve user's threads with pagination
|
|
4. Process and display content
|
|
|
|
### Webhook Integration Flow
|
|
1. Set up HTTPS endpoint
|
|
2. Register webhook subscription
|
|
3. Validate webhook signatures
|
|
4. Process incoming events
|
|
5. Respond with 200 OK status
|
|
|
|
## Best Practices
|
|
|
|
1. **Security**
|
|
- Never expose access tokens in client-side code
|
|
- Always validate webhook signatures
|
|
- Use environment variables for sensitive data
|
|
- Implement token refresh before expiration
|
|
|
|
2. **Performance**
|
|
- Cache API responses when appropriate
|
|
- Use batch requests for multiple operations
|
|
- Implement pagination for large result sets
|
|
- Monitor and respect rate limits
|
|
|
|
3. **User Experience**
|
|
- Provide clear error messages to users
|
|
- Show loading states during API calls
|
|
- Handle network failures gracefully
|
|
- Request only necessary permissions
|
|
|
|
4. **Content Publishing**
|
|
- Validate media URLs before uploading
|
|
- Check media format requirements
|
|
- Add appropriate error handling for failed uploads
|
|
- Consider using alt text for accessibility
|
|
|
|
## Resources
|
|
|
|
### Official Documentation
|
|
- Meta for Developers: https://developers.facebook.com/docs/threads
|
|
- API Reference: Available in `references/other.md`
|
|
|
|
### Developer Tools
|
|
- Meta App Dashboard: Configure your app and manage permissions
|
|
- Graph API Explorer: Test API calls interactively
|
|
- Webhook Testing: Test webhook endpoints before production
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**Authentication Errors (Code 190)**
|
|
- Check access token validity
|
|
- Verify token hasn't expired
|
|
- Ensure correct permissions/scopes
|
|
|
|
**Rate Limit Errors (Code 32)**
|
|
- Implement exponential backoff
|
|
- Monitor API usage
|
|
- Consider caching responses
|
|
|
|
**Media Upload Failures**
|
|
- Verify media URL is publicly accessible
|
|
- Check file format and size requirements
|
|
- Ensure proper media_type parameter
|
|
|
|
**Webhook Not Receiving Events**
|
|
- Verify endpoint is HTTPS
|
|
- Check webhook signature validation
|
|
- Ensure endpoint responds with 200 OK quickly
|
|
|
|
## Notes
|
|
|
|
- This skill was generated from Meta's official Threads API documentation
|
|
- The Threads API is part of Meta's Graph API family
|
|
- API features and endpoints may be updated by Meta - refer to official docs for latest changes
|
|
- Some features may require additional app review or permissions from Meta
|
|
|
|
## Updating
|
|
|
|
To refresh this skill with updated documentation:
|
|
1. Visit https://developers.facebook.com/docs/threads for the latest information
|
|
2. Re-run the documentation scraper with updated configuration
|
|
3. The skill will be rebuilt with current API information
|