> ## Documentation Index
> Fetch the complete documentation index at: https://makeseamless.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> MakeSeamless (makeseamless.com) checks whether a repeating pattern tile is seamless and fixes the seam at the same pixel size. Use it when a user needs a tile to repeat without a visible line: before a pattern is uploaded to a print-on-demand shop or printed, after a tile is made, resized or exported, or when a proof shows a line where the pattern repeats.
> Check first: POST https://makeseamless.com/v1/check with the image as the multipart field file. It is free and needs no account and no key. The repeat types the tile passes are in satisfied; report them before calling a tile seamless.
> Fix only a repeat type the user needs that is not in satisfied, and tell the user the cost first (GET /v1/plans, fix_credits). POST /v1/fix needs an API key in the x-api-key header. Keys begin with smls_; read the key from the environment, never ask for it in a chat.
> POST /v1/fix answers 202 with a job. Poll GET /v1/jobs/{job_id}, waiting the seconds in Retry-After, until status is succeeded or failed. The fixed PNG is at result.image_url. Answers are JSON, except the images, which are PNG.
> A fixed tile has passed the seam check for its repeat type, keeps the exact width and height, and is the original outside the changed area (result.changed_mask_url). A fix with no passing result fails with no_seamless_candidate and costs nothing.
> Branch on error.code, never on error.message, and retry only when error.retryable is true.

# List the plans, prices and credit cost of a seam fix

> The plans in US dollars. One credit is one fix; a large tile costs more (`fix_credits`). Free:
unlimited seam checks. Pro: credits each month by tier, billed monthly or yearly (the yearly price
is shown as its monthly equivalent and billed once a year, with twelve months of credits). A
Pro account can buy top-up credits at its tier's price per credit. Enterprise: contact sales.


```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
const response = await fetch("https://makeseamless.com/v1/plans", {
  method: "GET",
});

const data = await response.json();
console.log(data);
```

```php PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?php

$ch = curl_init("https://makeseamless.com/v1/plans");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
```

```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
import requests

response = requests.get(
    "https://makeseamless.com/v1/plans",
)

response.raise_for_status()
print(response.json())
```

```ruby Ruby theme={"theme":{"light":"github-light","dark":"vesper"}}
require "net/http"
require "uri"

uri = URI("https://makeseamless.com/v1/plans")
request = Net::HTTP::Get.new(uri)

response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts response.body
```

```go Go theme={"theme":{"light":"github-light","dark":"vesper"}}
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest("GET", "https://makeseamless.com/v1/plans", nil)
	if err != nil {
		panic(err)
	}

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

```java Java theme={"theme":{"light":"github-light","dark":"vesper"}}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://makeseamless.com/v1/plans"))
    .GET()
    .build();

HttpResponse<String> response = HttpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.body());
```

```csharp .NET theme={"theme":{"light":"github-light","dark":"vesper"}}
using System.Net.Http;

var request = new HttpRequestMessage(HttpMethod.Get, "https://makeseamless.com/v1/plans");

var client = new HttpClient();
var response = await client.SendAsync(request);

Console.WriteLine(await response.Content.ReadAsStringAsync());
```

```bash cURL theme={"theme":{"light":"github-light","dark":"vesper"}}
curl -X GET "https://makeseamless.com/v1/plans"
```

```json Response theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "free": {
    "signup_credits": 0
  },
  "fix_credits": {
    "credits": 1,
    "large_credits": 3,
    "large_above_px": 2048
  },
  "pro": [
    {
      "credits": 50,
      "monthly_usd": 19,
      "yearly_monthly_usd": 15,
      "yearly_usd": 180,
      "yearly_credits": 600,
      "topup_usd_per_credit": 0.38
    },
    {
      "credits": 135,
      "monthly_usd": 49,
      "yearly_monthly_usd": 39,
      "yearly_usd": 468,
      "yearly_credits": 1620,
      "topup_usd_per_credit": 0.363
    },
    {
      "credits": 280,
      "monthly_usd": 99,
      "yearly_monthly_usd": 79,
      "yearly_usd": 948,
      "yearly_credits": 3360,
      "topup_usd_per_credit": 0.354
    },
    {
      "credits": 430,
      "monthly_usd": 149,
      "yearly_monthly_usd": 119,
      "yearly_usd": 1428,
      "yearly_credits": 5160,
      "topup_usd_per_credit": 0.347
    }
  ],
  "topup": {
    "min_credits": 10,
    "max_credits": 10000
  },
  "enterprise": {
    "contact": true
  }
}
```


## OpenAPI

````yaml openapi.json GET /v1/plans
openapi: 3.1.0
info:
  title: MakeSeamless API
  version: 1.0.0
  summary: Check whether an image tiles seamlessly, and make it tile seamlessly.
  description: >
    Check a pattern tile for seams where its copies meet, and fix it so that it
    repeats without a

    visible seam.


    - A check is free and needs no account. A fix needs an API key and costs
    credits (`GET /v1/plans`).

    - A fix runs in the background: `POST /v1/fix` answers `202` with a job.
    Poll
      `GET /v1/jobs/{job_id}` until its `status` is `succeeded` or `failed`, waiting the seconds that
      `Retry-After` gives.
    - Every image the API returns has the exact width and height of the uploaded
    image (after its
      orientation is applied), as a fresh lossless PNG that carries no metadata of the upload.
    - Breaking changes come only under a new prefix (`/v2`). Fields may be added
    to responses; ignore
      the fields you do not know.
    - Error codes are stable: read `error.code`, not `error.message`. Any
    request may also fail with
      `500` and the code `internal_error`.
  license:
    name: Proprietary
servers:
  - url: https://makeseamless.com
security: []
tags:
  - name: check
    description: Seam check, answered at once.
  - name: fix
    description: Fix job, run in the background.
  - name: jobs
    description: Job status, result images and ratings.
  - name: health
    description: Service status.
  - name: account
    description: The account, its plan and credits.
paths:
  /v1/plans:
    get:
      tags:
        - account
      summary: Plans and prices
      description: >
        The plans in US dollars. One credit is one fix; a large tile costs more
        (`fix_credits`). Free:

        unlimited seam checks. Pro: credits each month by tier, billed monthly
        or yearly (the yearly price

        is shown as its monthly equivalent and billed once a year, with twelve
        months of credits). A

        Pro account can buy top-up credits at its tier's price per credit.
        Enterprise: contact sales.
      operationId: getPlans
      responses:
        '200':
          description: The plans.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Plans'
              example:
                free:
                  signup_credits: 0
                fix_credits:
                  credits: 1
                  large_credits: 3
                  large_above_px: 2048
                pro:
                  - credits: 50
                    monthly_usd: 19
                    yearly_monthly_usd: 15
                    yearly_usd: 180
                    yearly_credits: 600
                    topup_usd_per_credit: 0.38
                  - credits: 135
                    monthly_usd: 49
                    yearly_monthly_usd: 39
                    yearly_usd: 468
                    yearly_credits: 1620
                    topup_usd_per_credit: 0.363
                  - credits: 280
                    monthly_usd: 99
                    yearly_monthly_usd: 79
                    yearly_usd: 948
                    yearly_credits: 3360
                    topup_usd_per_credit: 0.354
                  - credits: 430
                    monthly_usd: 149
                    yearly_monthly_usd: 119
                    yearly_usd: 1428
                    yearly_credits: 5160
                    topup_usd_per_credit: 0.347
                topup:
                  min_credits: 10
                  max_credits: 10000
                enterprise:
                  contact: true
      security: []
      x-codeSamples:
        - lang: js
          label: Node.js
          source: |-
            const response = await fetch("https://makeseamless.com/v1/plans", {
              method: "GET",
            });

            const data = await response.json();
            console.log(data);
        - lang: php
          label: PHP
          source: |-
            <?php

            $ch = curl_init("https://makeseamless.com/v1/plans");
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $response = curl_exec($ch);
            curl_close($ch);

            echo $response;
        - lang: python
          label: Python
          source: |-
            import requests

            response = requests.get(
                "https://makeseamless.com/v1/plans",
            )

            response.raise_for_status()
            print(response.json())
        - lang: ruby
          label: Ruby
          source: >-
            require "net/http"

            require "uri"


            uri = URI("https://makeseamless.com/v1/plans")

            request = Net::HTTP::Get.new(uri)


            response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do
            |http|
              http.request(request)
            end


            puts response.body
        - lang: go
          label: Go
          source: "package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc main() {\n\treq, err := http.NewRequest(\"GET\", \"https://makeseamless.com/v1/plans\", nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tres, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer res.Body.Close()\n\n\tbody, _ := io.ReadAll(res.Body)\n\tfmt.Println(string(body))\n}"
        - lang: java
          label: Java
          source: |-
            import java.net.URI;
            import java.net.http.HttpClient;
            import java.net.http.HttpRequest;
            import java.net.http.HttpResponse;

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://makeseamless.com/v1/plans"))
                .GET()
                .build();

            HttpResponse<String> response = HttpClient.newHttpClient()
                .send(request, HttpResponse.BodyHandlers.ofString());

            System.out.println(response.body());
        - lang: csharp
          label: .NET
          source: >-
            using System.Net.Http;


            var request = new HttpRequestMessage(HttpMethod.Get,
            "https://makeseamless.com/v1/plans");


            var client = new HttpClient();

            var response = await client.SendAsync(request);


            Console.WriteLine(await response.Content.ReadAsStringAsync());
        - lang: bash
          label: cURL
          source: curl -X GET "https://makeseamless.com/v1/plans"
components:
  schemas:
    Plans:
      type: object
      additionalProperties: false
      required:
        - free
        - fix_credits
        - pro
        - topup
        - enterprise
      properties:
        fix_credits:
          type: object
          additionalProperties: false
          required:
            - credits
            - large_credits
            - large_above_px
          description: What a fix costs, shown before it starts.
          properties:
            credits:
              type: integer
              minimum: 1
              description: Credits of a fix.
            large_credits:
              type: integer
              minimum: 1
              description: >-
                Credits of a fix of a tile above `large_above_px` on either
                side.
            large_above_px:
              type: integer
              minimum: 1
        free:
          type: object
          additionalProperties: false
          required:
            - signup_credits
          properties:
            signup_credits:
              type: integer
              minimum: 0
              description: Credits a new account gets once.
        pro:
          type: array
          description: The Pro tiers, from the smallest.
          items:
            $ref: '#/components/schemas/ProTier'
        topup:
          type: object
          additionalProperties: false
          required:
            - min_credits
            - max_credits
          description: How many top-up credits one purchase takes.
          properties:
            min_credits:
              type: integer
              minimum: 1
            max_credits:
              type: integer
              minimum: 1
        enterprise:
          type: object
          additionalProperties: false
          required:
            - contact
          properties:
            contact:
              type: boolean
              const: true
              description: Sold by contact; no self-serve price.
    ProTier:
      type: object
      additionalProperties: false
      required:
        - credits
        - monthly_usd
        - yearly_monthly_usd
        - yearly_usd
        - yearly_credits
        - topup_usd_per_credit
      properties:
        credits:
          type: integer
          description: Credits a month; also the tier's id (`tier` in `GET /v1/me`).
        monthly_usd:
          type: number
          description: Price of a month, billed monthly.
        yearly_monthly_usd:
          type: number
          description: Monthly equivalent of the yearly price.
        yearly_usd:
          type: number
          description: The yearly price, billed once a year.
        yearly_credits:
          type: integer
          description: Credits granted at each yearly invoice.
        topup_usd_per_credit:
          type: number
          description: Price of one top-up credit on this tier.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.