mjapi.io Open in urlscan Pro
2606:4700:3032::ac43:c979  Public Scan

Submitted URL: http://mjapi.io/
Effective URL: https://mjapi.io/
Submission: On February 23 via api from US — Scanned from DE

Form analysis 5 forms found in the DOM

<form _ngcontent-ng-c413171865="" novalidate="" class="ng-untouched ng-pristine ng-invalid">
  <div _ngcontent-ng-c413171865="" class="switch-container"><span _ngcontent-ng-c413171865="" class="switch-first-label switch-label">Fairy</span>
    <div _ngcontent-ng-c413171865="" class="switch d-flex"><label _ngcontent-ng-c413171865="" class="switch"><input _ngcontent-ng-c413171865="" type="checkbox" name="accType" formcontrolname="accType" class="ng-untouched ng-pristine ng-valid"><span
          _ngcontent-ng-c413171865="" class="slider round"></span></label></div><span _ngcontent-ng-c413171865="" class="switch-first-label switch-label">Self Served</span>
  </div>
  <div _ngcontent-ng-c413171865="" class="form-group mb-3"><input _ngcontent-ng-c413171865="" type="email" placeholder="Email" aria-label="Email" name="email" formcontrolname="email" class="form-control ng-untouched ng-pristine ng-invalid"><!---->
  </div>
  <div _ngcontent-ng-c413171865="" class="not-registered">
    <div _ngcontent-ng-c413171865="" class="form-group mb-3 visually-hidden"><input _ngcontent-ng-c413171865="" type="text" placeholder="Username" aria-label="Username" name="username" formcontrolname="username"
        class="form-control ng-untouched ng-pristine ng-valid"><!----></div><!---->
  </div><!---->
  <div _ngcontent-ng-c413171865="" class="row">
    <div _ngcontent-ng-c413171865="" class="col-xs-12 d-flex justify-content-center"><button _ngcontent-ng-c413171865="" type="submit" class="btn btn-primary" disabled="">Go</button></div>
  </div>
</form>

<form _ngcontent-ng-c2888554429="" novalidate="" class="ng-untouched ng-pristine ng-valid">
  <div _ngcontent-ng-c2888554429="" class="form-control range"><input _ngcontent-ng-c2888554429="" type="range" min="1" max="100" step="1" id="btc-range" class="form-range ng-untouched ng-pristine ng-valid"></div>
  <p _ngcontent-ng-c2888554429="" class="d-flex justify-content-center">10$</p>
  <div _ngcontent-ng-c2888554429="" class="col-12 d-flex justify-content-center"><button _ngcontent-ng-c2888554429="" type="submit" class="btn btn-primary">Get</button></div>
</form>

<form _ngcontent-ng-c1585968777="" novalidate="" class="ng-untouched ng-pristine ng-valid">
  <div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="key" placeholder="API key" formcontrolname="key" class="form-control ng-untouched ng-pristine ng-valid"></div>
  <div _ngcontent-ng-c1585968777="" class="input-group mb-3"><textarea _ngcontent-ng-c1585968777="" type="text" name="prompt" placeholder="Prompt" formcontrolname="prompt" class="form-control ng-untouched ng-pristine ng-valid"></textarea></div>
  <div _ngcontent-ng-c1585968777="" class="row mb-5">
    <div _ngcontent-ng-c1585968777="" class="col-xs-12"><button _ngcontent-ng-c1585968777="" type="submit" class="btn btn-primary">Generate</button></div>
  </div>
</form>

<form _ngcontent-ng-c1585968777="" novalidate="" class="ng-untouched ng-pristine ng-valid">
  <div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="jobId" placeholder="Job id" formcontrolname="jobId" class="form-control ng-untouched ng-pristine ng-valid"></div>
  <div _ngcontent-ng-c1585968777="" class="row mb-5">
    <div _ngcontent-ng-c1585968777="" class="col-xs-12"><button _ngcontent-ng-c1585968777="" type="submit" class="btn btn-primary">Get progress</button></div>
  </div>
</form>

<form _ngcontent-ng-c1585968777="" novalidate="" class="ng-untouched ng-pristine ng-valid">
  <div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="key" placeholder="API key" formcontrolname="key" class="form-control ng-untouched ng-pristine ng-valid"></div>
  <div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="jobId" placeholder="Job id" formcontrolname="jobId" class="form-control ng-untouched ng-pristine ng-valid"></div>
  <div _ngcontent-ng-c1585968777="" class="row mb-5">
    <div _ngcontent-ng-c1585968777="" class="col-xs-12"><button _ngcontent-ng-c1585968777="" type="submit" class="btn btn-primary">Cancel job</button></div>
  </div>
</form>

Text Content

MIDJOURNEY API.
SIMPLE.
NO BS.

Discover



What is MidJourney™?

MidJourney™ is a revolutionary text-to-image AI generation tool. You can use it
exclusively via their official Discord bot. This would be fine for a few manual
generations, but if you want to include it in an automated pipeline, you'll soon
find that it's impossible, as there's no official API.

MJAPI to the rescue! Our unofficial API is the solution to all your problems.

Log in or Register

Fairy

Self Served


Go

How it works

(Fairy)





Register here and get your API Key via email. You get 1 day of free usage

You're ready to go! Check the API Usage section

Once your sub expires, you can extend it by any amount. Stripe, PayPal, BTC
accepted




Payment

Fairy

Self Served

1 DAY

Trial ended?
Get another sip



1$

7 DAYS

Not ready to commit?
No problem



6$

30 DAYS

Full month access
Renew manually



25$

SUBSCRIBE

Full month access
Auto-renews



22$





or

BITCOIN

Roughly $0.7 per day

10$

Get


What do you get?

Free Lunch
1 day of usage for new accounts – "The right to try"
Instant Access
You don't even need a password, we email you a key upon account creation and
you're ready to go
Simplified Workflow
Everything is a GET request, test it directly in your browser's address bar,
forget Postman
Clear Pricing
Pay for as little as 1 day, or subscribe for hassle-free auto-renewals
Secure Transactions
We partnered with Stripe and PayPal, the payment gateways we all know and love
Support
Reach out on discord or email whenever you need help or have questions

Fairy

Hassle-Free Setup
No need for a separate Discord account or MidJourney subscription - start right
away
Shared Resource Efficiency
Leverage our shared accounts for an eco-friendly experience, adhering to a
fair-use daily limit
Simplified Pricing
Enjoy lower costs, ideal for users with basic needs that are trying out mjapi

SelfServed

Full Control
Use your own MidJourney-enabled Discord account for a personalized experience
Dedicated Resources
Benefit from a dedicated worker, ensuring consistent performance and
availability, with no daily limits
Enhanced Privacy
Manage your integration with the assurance of complete privacy and security

API Usage

GET addjob
Request examples
 * Get 1 image, auto-upscaled:
   https://api.mjapi.io/addjob?key=YOURKEY&prompt=big strawberry --ar 16:9
 * Get 4 images, then make adjustments:
   https://api.mjapi.io/addjob?key=YOURKEY&type=grid&prompt=big strawberry --ar
   16:9
 * Adjust a previous job's result:
   https://api.mjapi.io/addjob?key=YOURKEY&parent_id=123213&pick=U3

Fields
 * key (required): your API Key
 * prompt (required if type is not specified or type='oneshot_upscaled'): your
   prompt, but with any special characters encoded to form a proper URL (for
   ex., use %20 for spaces). You're likely already using a library, so escaping
   the URL is already be handled for you. Most browsers also replace spaces
   correctly in the URL bar, so you can test it easily.
 * type (optional):
   * oneshot_upscaled (default if pick is not given): Randomly chooses one image
     from the 4 possible variations and upscales it, returning a single image.
     This is the quickest way of generating an image without bothering with
     variations and such. This is the functionality we've initially built
     mjapi.io for.
   * grid: Generates 4 images, on which you can follow-up with another request
     to pick a adjustment.
   * followup (default if pick is given): Adjust the result of an existing job.
     No need to specify it, as it's implied when you pass the pick parameter.
 * pick: The adjustment to carry out on a previous job. Create variations (V1,
   V2, V3, V4), upscale (U1, U2, U3, U4) or make any other special adjustment
   such as 'Zoom Out 2x' (valid values are returned in the original response as
   followup_menu). This assumes no type is passed or type=followup.
 * parent_id (required if pick is given): the job id returned from a previous,
   completed, job. And before you ask, yes, you can follow-up on follow-ups. 👌

Response

{
  "status": "success",
  "message": "Yummy!",
  "data": {
    "id": 5614325631231,
    "user_id": 4123172867356,
    "type": "oneshot_upscaled",
    "prompt": "photo of the moon taken from a luxurious skyscraper, starts glowing in space --ar 16:9 --version 5.1 --style raw",
    "progress": -1,
    "last_update": 1683876767,
    "result_url": null,
    "state": "new",
    "account_type": "fairy"
  }
}

Notable response fields
 * id (int): the job's id, that you can later use in other requests
 * type (enum str): oneshot_upscale, grid, followup
 * progress (int): -1 = pending; 0-99 = in progress; 100 = done. Here, it's
   usually -1, as the job didn't already start
 * result_url (str): available at any time after job transitions to 'in
   progress'. Useful for both partial and final results
 * state (enum str) : new, active, done, canceled, failed. Here, it's usually
   new or cancelled
 * account_type (enum str) : fairy, selfserve

Try it now
Generate

Rate limiting

There's a limit of 10 requests per 10sec. That's still a lot for 99% of users

GET getjob
Request example
 * Get a job's status https://api.mjapi.io/getjob?job_id=5614325

Fields
 * job_id: the job ID you've got from addjob

Response

{
  "status": "success",
  "message": "Yummy!",
  "data": {
    "id": 56143252232000,
    "user_id": 4123167356,
    "type": "oneshot_upscaled",
    "prompt": "photo of the moon taken from a luxurious skyscraper, starts glowing in space --ar 16:9 --version 5.1 --style raw",
    "progress": 55,
    "last_update": 1698658812,
    "result_url": null,
    "state": "active",
    "result_msg_id": null,
    "followup_menu": null
  }
}

Notable response fields
 * progress (int): -1 = pending; 0-99 = in progress; 100 = done
 * type (enum str): oneshot_upscale, grid, followup
 * state (enum str) : new, active, done, canceled, failed
 * result_url (str): available at any time after job transitions to 'in
   progress'. Useful for both partial and final results
 * result_msg_id (int): we don't talk about result_msg_id around here
 * followup_menu (str[]) : list of avaialable actions for initiating a follow-up
   job. Possible values: U1, U2, U3, U4, V1, V2, V3, V4, Vary (Strong), Vary
   (Subtle), Upscale (2x), Upscale (4x), Zoom Out 2x, Zoom Out 1.5x, ⬅, ➡, ⬆, ⬇.

Try it now
Get progress

Rate limiting

There's a limit of 10 requests per 10sec. That's still a lot for 99% of users

GET canceljob
Request examples
 * Cancel a job: https://api.mjapi.io/canceljob?key=YOURKEY&job_id=44321

Fields
 * key (required): your API Key
 * job_id (required): a job added via addjob.

Response

{
  "status": "success",
  "message": "Done",
  "data": null
}

Try it now
Cancel job

Rate limiting

There's a limit of 10 requests per 10sec. That's still a lot for 99% of users

FAQ


Q1. DO I NEED A MIDJOURNEY SUB?

No, only SelfServe accounts need to provide a MJ-enabled discord token


Q2. FAIRY ACCOUNT LIMITS?

Because resources are shared for this account type, we think it's only fair to
put a 'reasonable use' cap per day per account. Currently, it's between 80-150
jobs per 24H, and jobs that never started don't count. Another limit, though
obvious, is occasionally getting slower jobs due to increased overall load from
other users. We're happy to see high usage, and this prompts us to add more
horsepower to the backend, so on average everyone will have an decent experience


Q3. AVAILABLE PAYMENT METHODS?

We support Stripe (all packages), PayPal (except subs) and BTC/Lightning (pay
any amount)


Q4. WHAT ARE PERMA-CREDITS?

Simple: instead of per-day, you pay per-job. They're only consumed if you don't
have an active per-day plan. Pretty cool, huh?


Q5. WHY GET AND NOT POST?

We went full minimalistic here, the minimum effort for the desired result. It's
really convenient to copy-paste the request directly in Chrome and see the
result -- no Postman, curl etc. HTTPS makes sure the URL path/query etc. are
encrypted, so nothing to be worried about. We might also mirror the current API
via POST requests, if enough people ask for it


Q6. HOW DO I CANCEL MY SUB?

To cancel a Stripe sub, simply email us. If the email's subject matches 'please
cancel my sub' exactly, it'll be automatically cancelled. Otherwise, we'll do it
manually in 7-14 days. No worries, any extra charges will be refunded. Note that
this doesn't return your initial payment, and you'll continue benefiting from
the full existing sub. This merely cancels the auto-renewal, and it's how subs
work in general (we're not reinventing the wheel here)


Q7. CAN I GET A REFUND?

Sure, shoot at hi@mjapi.io. This only works for Stripe one-time-payments (for
subs see 'How do I cancel my sub?'). If the email's subject matches 'please
refund my previous payment' exactly, and you've paid less than 7 days ago, it's
done automatically. In case that doesn't happen, simply shoot us a follow-up
email.


Q8. WHAT IF MIDJOURNEY GETS THEIR OWN API?

mjapi.io started as a solution we've built for ourselves, and several projects
rely on it. We'll be too lazy to refactor all our front-ends. Instead, we'll
keep using mjapi.io and just adapt our back-end, if needed. This means you won't
notice a thing. 👍


Q9. WHY IS SELFSERVE MORE EXPENSIVE?

For safety reasons, SelfServe accounts require a dedicated runner instance on
our backend. This also means your prompts will get executed faster, since
there's no queue (unlike Fairy accounts)


Q10. HOW LONG SHOULD THE PROMPT BE?

At the moment, we limit prompts to 1000 chars for Fairy and 3000 for SelfServe,
but before thinking about reaching those lengths, please read:
https://mid-journey.ai/midjourney-prompt-length/








Blog
Discord   hi@mjapi.io
Terms of Use   Privacy Policy

2024 mjapi.io. All Rights Reserved

Other searches for midjourney include midjourner, midjourn, midgerny,
midjournez, mid journey al, middlejourney ai, midhurney, midjarny, midjourn ey,
midjourne y, midjourneyia, midjurni, mishourney, mitjurny, modjournet


WE USE COOKIES 🍪



Accept allReject all
Privacy