Postman collection

Adeli publishes a Postman collection with every /api/v1 request, a guided folder that publishes your first post, and an environment that holds your API key. It is the quickest way to try the API without writing code.

The collection lives in the public Adeli API workspace on Postman. It is generated from the same OpenAPI document the API is described by, so every request body is a valid example rather than a schema placeholder.

Fork the collection

Run in Postman

  1. Select Run in Postman above and fork the collection into a personal or team workspace you control. Or open the Adeli API workspace and select Fork on the Adeli API collection.
  2. In the workspace, fork the Adeli environment too.
  3. In your workspace, select the Adeli environment in the top-right environment picker.

Forking, rather than importing a copy, lets you pull updates when the API changes. See Staying current.

Set your API key

Create a key in the dashboard under Settings → API keys. It starts with rk_live_. Paste it into the environment's apiKey value.

Every request inherits Authorization: Bearer {{apiKey}} from the collection, so there is nothing to set per request. The environment's baseUrl is https://app.tryadeli.com; change it to http://localhost:3000 if you run Adeli locally.

Keep the key out of public workspaces

apiKey is a secret variable, so Postman masks it on screen. Put the key in its current value, which stays on your machine, and leave the initial value empty, because initial values are shared with anyone who can see the workspace. Never paste the key into the collection or a request. If one leaks, delete it under Settings → API keys; revocation is immediate.

Start here: publish your first post

The first folder, Start here: publish your first post, publishes one image to an Instagram account connected to your organization. Run its requests in order: each one saves the ids the next one needs into collection variables.

Before you start, set two collection variables to describe the image you will upload: uploadContentType (image/jpeg, image/png, or image/webp) and uploadFileSize, the file's exact size in bytes. S3 checks the size, so it must match the file.

RequestWhat it doesSaves
1. Check your API keyGET /api/v1/me confirms the key works and names your default profile.profileId
2. Find a connected Instagram accountGET /api/v1/accounts?platform=instagram lists the accounts you can publish from.accountId, profileId
3. Prepare the uploadPOST /api/v1/media/uploads returns a short-lived S3 upload URL and the headers it needs.uploadId, uploadUrl, uploadHeaders
4. Upload the file to S3PUT {{uploadUrl}} sends your image straight to S3. Choose the file under Body → binary.—
5. Publish the postPOST /api/v1/posts publishes the staged image with a caption.jobId
6. Check the post's statusGET /api/v1/posts/instagram/status reports queued, processing, published, or failed. Send it again until the post is published.postId

Step 5 posts for real

There is no sandbox mode. The post goes live on the account step 2 found, so use an account you do not mind posting to, and delete the post on Instagram afterwards if it was only a test.

No account connected yet? Connect one in the dashboard, or send Profiles → Start connecting a social account and open the authUrl it returns. See the connect reference.

Variables

Requests in the other folders use the same collection variables, so an id one request saves is ready for the next. Ids nothing saves for you are left blank for you to fill.

VariableSet by
profileId1. Check your API key, or 2. Find a connected Instagram account
accountId2. Find a connected Instagram account
secondAccountIdYou, for a publication to two accounts
uploadId, uploadUrl, uploadHeadersPrepare direct media uploads
uploadContentType, uploadFileSizeYou, before preparing an upload
thumbnailUploadIdYou, for a YouTube thumbnail
jobIdPublish a post, for an Instagram post
postIdCheck an Instagram post's publishing status
connectionSessionIdStart connecting a social account
publicationIdPublish one post to several accounts
webhookIdCreate a webhook
commentId, adAccountId, campaignId, adGroupIdYou, from a list request

Optional query parameters start switched off. Tick one in the Params tab to send it.

Uploading media

Every request that publishes media takes a staged upload_id, never the file itself. Prepare the upload, PUT the file to the returned url with the returned headers sent unchanged, then publish with upload_id. The Prepare direct media uploads request saves the uploadId that the Publish a post requests use. See media uploads for the limits per platform.

Publish a post has one request per network, named after it: Instagram image or Reel, Facebook photo, TikTok video, YouTube video, X, Bluesky, and LinkedIn image or document. The TikTok video (multipart, legacy) request uploads the file in the request itself and stays only for compatibility.

Staying current

The collection is regenerated from /docs/openapi.json and republished whenever the API changes. In your fork, open the collection's … menu and select Pull changes to bring in new and changed requests. Local edits to a request you also change in the fork can conflict; Postman shows both versions and lets you choose.

Troubleshooting

ResponseCause
401 unauthorizedapiKey is empty, or the Adeli environment is not selected.
403 permission_requiredThe connected account has not granted a permission this request needs. The error names it; reconnect the account to grant it.
402 usage_limit_reachedThe workspace used its free monthly allowance. See Billing.
403 from S3 in step 4A header from step 3 was changed or left out, or the upload URL expired. Send step 3 again.
422 invalid_mediaThe file does not match uploadContentType or uploadFileSize, or exceeds the platform's limit.

Every error has the same JSON envelope. See Errors.