Autenticação
Every request must include your API key as a Bearer token and your Workspace ID. You can create API keys from Dashboard ? Settings ? API Keys (Growth plan required).
Headers obrigatórios
Authorization: Bearer sk_aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890abcd Content-Type: application/json
The workspace is determined automatically from the API key. No X-Workspace-Id header needed. The key is only shown once at creation time; store it securely.
Quick example. Create a post
curl https://useinmedia.com/api/v1/posts \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{"title":"My post","prompt":"Bold product post for Instagram"}'import requests
response = requests.post(
"https://useinmedia.com/api/v1/posts",
headers={"Authorization": "Bearer sk_..."},
json={
"title": "My post",
"prompt": "Bold product post for Instagram",
}
)
post = response.json()const response = await fetch("https://useinmedia.com/api/v1/posts", {
method: "POST",
headers: {
"Authorization": "Bearer sk_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "My post",
prompt: "Bold product post for Instagram",
}),
});
const post = await response.json();using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer sk_...");
var payload = new {
title = "My post",
prompt = "Bold product post for Instagram"
};
var response = await client.PostAsJsonAsync(
"https://useinmedia.com/api/v1/posts", payload);
var post = await response.Content.ReadFromJsonAsync<JsonDocument>();<?php
$ch = curl_init("https://useinmedia.com/api/v1/posts");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer sk_...",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"title" => "My post",
"prompt" => "Bold product post for Instagram",
]),
]);
$post = json_decode(curl_exec($ch), true);Error codes
| Code | Meaning |
|---|---|
| 400 | Requisição inválida. Parâmetros incorretos |
| 401 | Unauthorized. Missing or invalid API key |
| 403 | Forbidden. Resource not available on your plan |
| 404 | Not Found. Resource does not exist |
| 429 | Rate limit excedido. Reduza a frequência |
Webhook events
Pass a comma-separated list of event names to the events field when creating a webhook.
Formato do payload
Every webhook delivery is a POST request with the following JSON body:
{
"event": "post.published",
"workspaceId": "a1b2c3d4-...",
"timestamp": "2026-04-14T15:30:00Z",
"data": {
"id": "3f7a1b2c-...",
"title": "Air Jordan launch",
"status": "published",
"imageUrl": "https://...",
"publishedAt": "2026-04-14T15:30:00Z"
}
}
Segurança do Webhook
If you provide a secret when creating a webhook, InMedia will sign every delivery with HMAC-SHA256. Verify the signature to ensure the request came from InMedia.
Signature header
X-InMedia-Signature: sha256=abc123...
The value is the HMAC-SHA256 hex digest of the raw request body using your webhook secret as the key.
Signature verification
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}import hmac, hashlib
def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)using System.Security.Cryptography;
using System.Text;
bool VerifySignature(byte[] payload, string signature, string secret)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(payload);
var expected = "sha256=" + Convert.ToHexString(hash).ToLower();
return CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(signature),
Encoding.UTF8.GetBytes(expected)
);
}<?php
function verify_signature(
string $payload,
string $signature,
string $secret
): bool {
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
return hash_equals($expected, $signature);
}Posts
Create and manage posts. Call POST /{id}/generate after creating a post to produce AI content.
| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| status | string | optional | Filter by status: draft | scheduled | published | failed |
| page | integer | optional | Page number (default: 1) |
| pageSize | integer | optional | Items per page, max 100 (default: 20) |
curl https://useinmedia.com/api/v1/posts \ -H "Authorization: Bearer sk_..."
[
{
"id": "3f7a1b2c-...",
"workspaceId": "a1b2c3d4-...",
"projectId": "e5f6g7h8-...",
"title": "Air Jordan launch",
"prompt": "Bold Instagram post for sneaker drop",
"status": "published",
"imageUrl": "https://...",
"hasVideo": false,
"format": "instagram_square",
"createdAt": "2026-04-14T12:00:00Z"
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| title | string | required | Título do post (máx 200 chars) |
| prompt | string | required | Prompt de geração (máx 5000 chars) |
| projectId | guid | required | Project to associate the post with |
| brandKitId | guid | optional | Brand Kit to apply to generation |
{
"title": "Air Jordan launch",
"prompt": "Bold Instagram post for a sneaker drop. Black and gold palette.",
"projectId": "e5f6g7h8-...",
"brandKitId": "k1l2m3n4-..."
}curl https://useinmedia.com/api/v1/posts \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "title": "Air Jordan launch", "prompt": "Bold Instagram post for a sneaker drop. Black and gold palette.", "projectId": "e5f6g7h8-...", "brandKitId": "k1l2m3n4-..." }'
{
"id": "3f7a1b2c-...",
"title": "Air Jordan launch",
"status": "draft",
"imageUrl": "https://...",
"hasVideo": false,
"createdAt": "2026-04-14T12:00:00Z"
}curl https://useinmedia.com/api/v1/posts/<id> \ -H "Authorization: Bearer sk_..."
{
"id": "3f7a1b2c-...",
"workspaceId": "a1b2c3d4-...",
"projectId": "e5f6g7h8-...",
"title": "Air Jordan launch",
"prompt": "Bold Instagram post for sneaker drop",
"status": "published",
"imageUrl": "https://...",
"hasVideo": false,
"format": "instagram_square",
"brandKitId": null,
"scheduledAt": null,
"publishedAt": "2026-04-14T15:30:00Z",
"createdAt": "2026-04-14T12:00:00Z",
"updatedAt": "2026-04-14T15:30:00Z"
}curl https://useinmedia.com/api/v1/posts/project/<projectId> \ -H "Authorization: Bearer sk_..."
[ { "id": "...", "title": "..." } ]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| title | string | optional | Novo título (máx 200 chars) |
| prompt | string | optional | Novo prompt (máx 5000 chars) |
| status | string | optional | draft | scheduled | published | failed |
| scheduledAt | datetime | optional | Scheduled date/time ISO 8601 |
| brandKitId | guid | optional | Brand Kit to apply |
{ "title": "Updated title", "status": "draft" }curl https://useinmedia.com/api/v1/posts/<id> \
-X PUT \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "title": "Updated title", "status": "draft" }'
{
"id": "3f7a1b2c-...",
"title": "Updated title",
"status": "draft",
"updatedAt": "2026-04-14T13:00:00Z"
}curl https://useinmedia.com/api/v1/posts/<id> \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| prompt | string | optional | New prompt; omit to regenerate with the existing prompt |
| format | string | optional | Proporção: 1:1 | 9:16 | 16:9 (padrão: 1:1) |
{ "prompt": "Make it more energetic", "format": "1:1" }curl https://useinmedia.com/api/v1/posts/<id>/generate \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "prompt": "Make it more energetic", "format": "1:1" }'
{
"post": {
"id": "3f7a1b2c-...",
"status": "draft",
"imageUrl": "https://...",
"hasVideo": false,
"updatedAt": "2026-04-14T13:00:00Z"
},
"respond": "Updated the design with more vibrant colors."
}curl https://useinmedia.com/api/v1/posts/<id>/render \ -X POST \ -H "Authorization: Bearer sk_..."
{ "id": "...", "imageUrl": "https://...", "status": "draft" }curl https://useinmedia.com/api/v1/posts/<id>/publish \ -X POST \ -H "Authorization: Bearer sk_..."
{ "id": "...", "status": "published", "publishedAt": "2026-04-14T15:30:00Z" }| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| scheduledAt | datetime | required | Publication date/time ISO 8601 (UTC) |
{ "scheduledAt": "2026-04-15T09:00:00Z" }curl https://useinmedia.com/api/v1/posts/<id>/schedule \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "scheduledAt": "2026-04-15T09:00:00Z" }'
{ "id": "...", "status": "scheduled", "scheduledAt": "2026-04-15T09:00:00Z" }| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| connectionIds | guid[] | required | List of social connection IDs to publish |
| scheduledAt | datetime | optional | If provided, schedules instead of publishing immediately |
{
"connectionIds": ["conn-uuid-1", "conn-uuid-2"],
"scheduledAt": null
}curl https://useinmedia.com/api/v1/posts/<id>/publish-social \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "connectionIds": ["conn-uuid-1", "conn-uuid-2"], "scheduledAt": null }'
[
{
"connectionId": "conn-uuid-1",
"platform": "Instagram",
"status": "Published",
"externalPostId": "ext-123",
"errorMessage": null
}
]curl https://useinmedia.com/api/v1/posts/<id>/publish-targets \ -H "Authorization: Bearer sk_..."
[
{
"connectionId": "conn-uuid-1",
"platform": "Instagram",
"status": "Published",
"externalPostId": "ext-123",
"errorMessage": null
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| format | string | optional | png (padrão) ou jpg |
curl https://useinmedia.com/api/v1/posts/<id>/download \ -H "Authorization: Bearer sk_..."
Binary file (image/png or image/jpeg)
curl https://useinmedia.com/api/v1/posts/<id>/versions \ -H "Authorization: Bearer sk_..."
[
{
"id": "ver-uuid-...",
"versionNumber": 3,
"label": "Dark theme variant",
"createdAt": "2026-04-14T12:00:00Z"
}
]curl https://useinmedia.com/api/v1/posts/<id>/versions/<versionId>/restore \ -X POST \ -H "Authorization: Bearer sk_..."
{ "id": "...", "status": "draft", "imageUrl": "https://...", "updatedAt": "2026-04-14T13:00:00Z" }Projects
Organize posts under projects. Starter plan is limited to 3 active projects.
| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| status | string | optional | Filter: active | archived |
curl https://useinmedia.com/api/v1/projects \ -H "Authorization: Bearer sk_..."
[
{
"id": "e5f6g7h8-...",
"name": "Nike Campaign",
"description": "Q2 2026 drop",
"icon": "👟",
"color": "#00f2ff",
"status": "active",
"createdAt": "2026-01-10T09:00:00Z"
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | required | Project name |
| description | string | optional | Optional description |
| icon | string | optional | Emoji ícone |
| color | string | optional | Cor hex ex: #00f2ff |
{
"name": "Nike Campaign",
"description": "Q2 2026 drop",
"icon": "👟",
"color": "#00f2ff"
}curl https://useinmedia.com/api/v1/projects \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "name": "Nike Campaign", "description": "Q2 2026 drop", "icon": "👟", "color": "#00f2ff" }'
{
"id": "e5f6g7h8-...",
"name": "Nike Campaign",
"status": "active",
"createdAt": "2026-04-14T12:00:00Z"
}| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | optional | New name |
| description | string | optional | New description |
| status | string | optional | active | archived |
{ "name": "Nike Campaign v2", "status": "archived" }curl https://useinmedia.com/api/v1/projects/<id> \
-X PUT \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "name": "Nike Campaign v2", "status": "archived" }'
{ "id": "...", "name": "Nike Campaign v2", "status": "archived" }curl https://useinmedia.com/api/v1/projects/<id> \ -H "Authorization: Bearer sk_..."
{
"id": "e5f6g7h8-...",
"name": "Nike Campaign",
"description": "Q2 2026 drop",
"icon": "👟",
"color": "#00f2ff",
"status": "active",
"coverUrl": "https://...",
"createdAt": "2026-01-10T09:00:00Z"
}| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| file | file | required | JPEG, PNG ou WebP. Máx 10 MB |
curl https://useinmedia.com/api/v1/projects/<id>/cover \ -X POST \ -H "Authorization: Bearer sk_..."
{ "id": "...", "coverUrl": "https://...", "name": "Nike Campaign" }curl https://useinmedia.com/api/v1/projects/<id>/cover \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
curl https://useinmedia.com/api/v1/projects/<id> \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
Brand Kits
Store brand colors, fonts and logos. Starter plan is limited to 1 Brand Kit.
curl https://useinmedia.com/api/v1/brandkits \ -H "Authorization: Bearer sk_..."
[
{
"id": "k1l2m3n4-...",
"name": "Main Brand",
"colorsJson": "{\"primary\":\"#00f2ff\",\"secondary\":\"#020408\"}",
"fontsJson": "{\"heading\":\"Plus Jakarta Sans\",\"body\":\"Inter\"}",
"logoUrl": "https://..."
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | required | Brand Kit name |
| colors.primary | string | optional | Primary color hex |
| colors.secondary | string | optional | Secondary color hex |
| colors.accent | string | optional | Accent color hex |
| colors.neutral | string | optional | Neutral color hex |
| fonts.heading | string | optional | Title font |
| fonts.body | string | optional | Body font |
| logoUrl | string | optional | Public URL of logo image |
{
"name": "Main Brand",
"colors": {
"primary": "#00f2ff",
"secondary": "#020408",
"accent": "#ffffff",
"neutral": "#888888"
},
"fonts": {
"heading": "Plus Jakarta Sans",
"body": "Inter"
},
"logoUrl": "https://example.com/logo.png"
}curl https://useinmedia.com/api/v1/brandkits \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "name": "Main Brand", "colors": { "primary": "#00f2ff", "secondary": "#020408", "accent": "#ffffff", "neutral": "#888888" }, "fonts": { "heading": "Plus Jakarta Sans", "body": "Inter" }, "logoUrl": "https://example.com/logo.png" }'
{ "id": "k1l2m3n4-...", "name": "Main Brand", ... }| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | optional | New name |
| colors | object | optional | Colors to update (same format as create) |
| fonts | object | optional | Fonts to update |
{ "colors": { "primary": "#ff5733" } }curl https://useinmedia.com/api/v1/brandkits/<id> \
-X PUT \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "colors": { "primary": "#ff5733" } }'
{ "id": "...", "name": "Main Brand", ... }curl https://useinmedia.com/api/v1/brandkits/<id> \ -H "Authorization: Bearer sk_..."
{
"id": "k1l2m3n4-...",
"name": "Main Brand",
"colorsJson": "{\"primary\":\"#00f2ff\",\"secondary\":\"#020408\"}",
"fontsJson": "{\"heading\":\"Plus Jakarta Sans\",\"body\":\"Inter\"}",
"logoUrl": "https://..."
}curl https://useinmedia.com/api/v1/brandkits/<id> \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
Schedules
Automate recurring content generation with cron schedules. Requires Growth plan.
curl https://useinmedia.com/api/v1/schedules \ -H "Authorization: Bearer sk_..."
[
{
"id": "s1s2s3s4-...",
"name": "Daily Instagram Post",
"cronExpression": "0 9 * * *",
"isActive": true,
"promptTemplate": "Generate a motivational post for today.",
"nextRunAt": "2026-04-15T09:00:00Z"
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | required | Schedule name |
| cronExpression | string | required | 5-field cron expression e.g. "0 9 * * 1" |
| promptTemplate | string | optional | Prompt used on each run (max 5000 chars) |
| projectId | guid | optional | Project of generated posts |
| brandKitId | guid | optional | Brand Kit to apply |
{
"name": "Daily Instagram Post",
"cronExpression": "0 9 * * *",
"promptTemplate": "Generate a motivational post for today.",
"projectId": "e5f6g7h8-...",
"brandKitId": "k1l2m3n4-..."
}curl https://useinmedia.com/api/v1/schedules \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "name": "Daily Instagram Post", "cronExpression": "0 9 * * *", "promptTemplate": "Generate a motivational post for today.", "projectId": "e5f6g7h8-...", "brandKitId": "k1l2m3n4-..." }'
{
"id": "s1s2s3s4-...",
"name": "Daily Instagram Post",
"cronExpression": "0 9 * * *",
"isActive": true,
"nextRunAt": "2026-04-15T09:00:00Z"
}| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | optional | New name |
| cronExpression | string | optional | New cron expression |
| isActive | boolean | optional | Enable or disable the schedule |
| promptTemplate | string | optional | New prompt template |
{ "isActive": false }curl https://useinmedia.com/api/v1/schedules/<id> \
-X PUT \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "isActive": false }'
{ "id": "...", "isActive": false, ... }curl https://useinmedia.com/api/v1/schedules/<id> \ -H "Authorization: Bearer sk_..."
{
"id": "s1s2s3s4-...",
"name": "Daily Instagram Post",
"cronExpression": "0 9 * * *",
"isActive": true,
"promptTemplate": "Generate a motivational post for today.",
"lastRunAt": "2026-04-13T09:00:00Z",
"nextRunAt": "2026-04-15T09:00:00Z"
}curl https://useinmedia.com/api/v1/schedules/<id> \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
Webhooks
Receive real-time HTTP notifications when events occur in your workspace. Requires Growth plan.
curl https://useinmedia.com/api/v1/webhooks \ -H "Authorization: Bearer sk_..."
[
{
"id": "w1w2w3w4-...",
"url": "https://yourapp.com/hooks/inmedia",
"events": "post.published,post.failed",
"isActive": true,
"lastTriggeredAt": "2026-04-14T10:00:00Z"
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| url | string | required | HTTPS endpoint to receive events |
| events | string | required | Event names separated by commas (see Events section) |
| secret | string | optional | Optional secret for HMAC-SHA256 signature verification |
{
"url": "https://yourapp.com/hooks/inmedia",
"events": "post.published,post.failed",
"secret": "my-webhook-secret"
}curl https://useinmedia.com/api/v1/webhooks \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "url": "https://yourapp.com/hooks/inmedia", "events": "post.published,post.failed", "secret": "my-webhook-secret" }'
{
"id": "w1w2w3w4-...",
"url": "https://yourapp.com/hooks/inmedia",
"events": "post.published,post.failed",
"isActive": true,
"createdAt": "2026-04-14T12:00:00Z"
}| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| url | string | optional | New endpoint URL |
| events | string | optional | New list of events |
| isActive | boolean | optional | Enable or disable |
{ "isActive": false }curl https://useinmedia.com/api/v1/webhooks/<id> \
-X PUT \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "isActive": false }'
{ "id": "...", "isActive": false, ... }curl https://useinmedia.com/api/v1/webhooks/<id> \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
Video
Poll video generation jobs and retrieve presigned URLs. Video generation is initiated from the dashboard editor.
curl https://useinmedia.com/api/v1/video/jobs/<jobId> \ -H "Authorization: Bearer sk_..."
{
"status": "done",
"postId": "e5f6g7h8-...",
"videoUrl": "https://presigned-s3-url...",
"message": "Video generated successfully!",
"error": null
}curl https://useinmedia.com/api/v1/video/presign/<postId> \ -H "Authorization: Bearer sk_..."
{ "url": "https://presigned-s3-url..." }Usage
Check your plan quota and generation activity.
| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| page | integer | optional | Page number (default: 1) |
| pageSize | integer | optional | Items per page (default: 50) |
curl https://useinmedia.com/api/v1/usage/activity \ -H "Authorization: Bearer sk_..."
{
"activity": [
{
"id": "t1t2t3t4-...",
"type": "PostGeneration",
"typeLabel": "Content generation",
"description": "Air Jordan launch",
"createdAt": "2026-04-14T12:00:00Z"
}
]
}API Keys
Create and manage programmatic API keys. Requires Growth plan.
curl https://useinmedia.com/api/v1/api-keys \ -H "Authorization: Bearer sk_..."
[
{
"id": "key-uuid-...",
"name": "Production key",
"keyPrefix": "sk_abcd",
"isActive": true,
"lastUsedAt": "2026-04-13T08:00:00Z",
"expiresAt": null,
"createdAt": "2026-01-01T00:00:00Z"
}
]| Name | Type | Obrigatório | Descrição |
|---|---|---|---|
| name | string | required | Descriptive name for the key |
| expiresAt | datetime | optional | Optional expiration (ISO 8601) |
{ "name": "Production key" }curl https://useinmedia.com/api/v1/api-keys \
-X POST \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "name": "Production key" }'
{
"id": "key-uuid-...",
"key": "sk_aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890abcd",
"prefix": "sk_aBcDe",
"name": "Production key"
}curl https://useinmedia.com/api/v1/api-keys/<id> \ -X DELETE \ -H "Authorization: Bearer sk_..."
204 No Content
curl https://useinmedia.com/api/v1/api-keys/<id>/regenerate \ -X POST \ -H "Authorization: Bearer sk_..."
{ "id": "...", "key": "sk_NEW...", "prefix": "sk_NEW" }