{
  "info": {
    "name": "Growwer API v1",
    "_postman_id": "1ee3103c-aa17-4408-b00c-6198c04466bb",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Every Growwer API v1 operation, one folder per resource, generated from https://growwer.com/openapi.json.\n\nSet the api_key collection variable to a key created at https://tool.growwer.com/user/profile/api-keys: a read key calls every GET operation and the estimates, writes need a read and write key.\n\nOptional query parameters ship disabled: tick the ones you need.\n\nEvery write sends an Idempotency-Key that Postman regenerates on each send ({{$guid}}). To retry a request whose response you lost, send it again with the key it used, so it does not run twice.\n\nFull reference: https://growwer.com/api-docs/"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://tool.growwer.com"
    },
    {
      "key": "api_key",
      "value": ""
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Account",
      "item": [
        {
          "name": "Your account",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/me",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "me"
              ]
            },
            "description": "Profile basics, the buyer and seller balances, whether your seller account is restricted, whether the catalogue is open to you, and whether you have a managed service."
          }
        },
        {
          "name": "Set your holiday",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/holiday",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "holiday"
              ]
            },
            "description": "Starts, changes or ends your holiday, as the holiday settings of your profile page do. While you are on holiday your medias take no orders. `endDate` is the day your holiday ends, at 00:00 of that day in Growwer's server time, and must be later than now; leave it out, or send null, for a holiday you end yourself. Ending the holiday takes no `endDate`.\n\nA holiday that already is as you ask is answered 200 without a change. A restricted seller account stays on holiday until the restriction is lifted, so any change is refused. Your holiday is also in GET /me.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"onHoliday\": false,\n  \"endDate\": \"2026-12-01\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Codes and names",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/vocabulary",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "vocabulary"
              ]
            },
            "description": "The countries, languages, topics, product types, link types and order states that other operations take and return. Names are in English."
          }
        }
      ]
    },
    {
      "name": "Saved filters",
      "item": [
        {
          "name": "List the saved filters of a project",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/saved-filters",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "saved-filters"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                }
              ]
            },
            "description": "Your saved filters of one of your projects, newest first, including those saved on the web. A project has at most 100. Apply one with `savedFilterId` on GET /projects/{id}/medias."
          }
        },
        {
          "name": "Save a filter",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/saved-filters",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "saved-filters"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                }
              ]
            },
            "description": "Saves a catalogue search of one of your projects, which then also appears on the web. `filters` takes the filter parameters of GET /projects/{id}/medias, and `source`, with the same values; lists may be JSON arrays and flags JSON booleans. With `notificationFrequency`, Growwer emails you new medias that match. A project has at most 100 saved filters and an account 500.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"string\",\n  \"filters\": {\n    \"language\": [\n      \"es\"\n    ],\n    \"minDomainRating\": 30,\n    \"favourite\": true\n  },\n  \"notificationFrequency\": \"daily\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Delete a saved filter",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/saved-filters/:filterId",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "saved-filters",
                ":filterId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                },
                {
                  "key": "filterId",
                  "value": "",
                  "description": "The saved filter."
                }
              ]
            },
            "description": "Deletes one of your saved filters of one of your projects, including one saved on the web. Its notifications stop."
          }
        },
        {
          "name": "Count the medias of a saved filter",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/saved-filters/:filterId/media-count",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "saved-filters",
                ":filterId",
                "media-count"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                },
                {
                  "key": "filterId",
                  "value": "",
                  "description": "The saved filter."
                }
              ]
            },
            "description": "How many medias of the project's catalogue one of your saved filters matches: the `total` of GET /projects/{id}/medias with its `savedFilterId`. The number is cached for up to 24 hours, and it can differ from the count the web shows, which is not limited to the project's catalogue. A filter saved on the web that uses a filter the API does not support is refused with 422 `saved_filter_unsupported`."
          }
        }
      ]
    },
    {
      "name": "Catalogue",
      "item": [
        {
          "name": "List flash offers",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/flash-offers?projectId=00000000-0000-0000-0000-000000000000",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "flash-offers"
              ],
              "query": [
                {
                  "key": "projectId",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": "The project to search flash offers for.",
                  "disabled": false
                },
                {
                  "key": "source",
                  "value": "all",
                  "description": "Which of the project's medias to search: `all` (the default), `recommended` (those Growwer recommends for the project), or those you marked `favourite`, `discarded` or `requested`, or `bought` for the project. Do not combine it with the parameter of the same state.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-growwerRank",
                  "description": "The order. Without it, the web's default order: medias on the project's topic and language first, then best sellers and medias with more published orders. Ties are always broken by media id, so pages never overlap. `-growwerRank`: best match first; `postPrice`, `linkAdditionPrice`: cheapest first; `matchedAt`, `-matchedAt`: when Growwer matched the media with the project; `-traffic`, `-domainRating`, `-referringDomains`: highest first; `linkedToReferringRatio`: lowest first.",
                  "disabled": true
                },
                {
                  "key": "domain",
                  "value": "string",
                  "description": "Medias whose domain contains this text, 1 to 255 characters.",
                  "disabled": true
                },
                {
                  "key": "websiteType",
                  "value": "string",
                  "description": "A comma-separated list of website types: `blog`, `press`.",
                  "disabled": true
                },
                {
                  "key": "language",
                  "value": "string",
                  "description": "A comma-separated list of language codes, as in GET /vocabulary.",
                  "disabled": true
                },
                {
                  "key": "country",
                  "value": "string",
                  "description": "A comma-separated list of country codes, as in GET /vocabulary.",
                  "disabled": true
                },
                {
                  "key": "topics",
                  "value": "string",
                  "description": "A comma-separated list of topic ids, as in GET /vocabulary: medias on any of them.",
                  "disabled": true
                },
                {
                  "key": "notBannedTopics",
                  "value": "false",
                  "description": "Leave out medias that refuse the topic of the project. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "minTraffic",
                  "value": "0",
                  "description": "Minimum monthly organic traffic.",
                  "disabled": true
                },
                {
                  "key": "maxTraffic",
                  "value": "0",
                  "description": "Maximum monthly organic traffic.",
                  "disabled": true
                },
                {
                  "key": "trafficTrendUpward",
                  "value": "false",
                  "description": "Medias whose traffic is growing. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "minDomainRating",
                  "value": "0",
                  "description": "Minimum domain rating, 0 to 100.",
                  "disabled": true
                },
                {
                  "key": "maxDomainRating",
                  "value": "0",
                  "description": "Maximum domain rating, 0 to 100.",
                  "disabled": true
                },
                {
                  "key": "minLinkedToReferringRatio",
                  "value": "0",
                  "description": "Minimum ratio of linked domains to referring domains, such as 0.5.",
                  "disabled": true
                },
                {
                  "key": "maxLinkedToReferringRatio",
                  "value": "0",
                  "description": "Maximum ratio of linked domains to referring domains, such as 1.5.",
                  "disabled": true
                },
                {
                  "key": "minPostPrice",
                  "value": "0",
                  "description": "Minimum post price, in cents.",
                  "disabled": true
                },
                {
                  "key": "maxPostPrice",
                  "value": "0",
                  "description": "Maximum post price, in cents.",
                  "disabled": true
                },
                {
                  "key": "postLinkType",
                  "value": "string",
                  "description": "A comma-separated list of link types the post offer gives: `dofollow`, `nofollow`, `citation`.",
                  "disabled": true
                },
                {
                  "key": "promotedSocialNetwork",
                  "value": "string",
                  "description": "A comma-separated list of social networks the media promotes posts on: `twitter`, `instagram`, `facebook`, `pinterest`, `tumblr`, `newsletter`.",
                  "disabled": true
                },
                {
                  "key": "withoutAdvertisingLabel",
                  "value": "false",
                  "description": "Medias that never label posts as advertising. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "homepageListing",
                  "value": "false",
                  "description": "Medias that offer listing the post on their homepage. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "hasLinkAddition",
                  "value": "false",
                  "description": "Medias that offer adding a link to an existing article. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "minLinkAdditionPrice",
                  "value": "0",
                  "description": "Minimum link addition price, in cents.",
                  "disabled": true
                },
                {
                  "key": "maxLinkAdditionPrice",
                  "value": "0",
                  "description": "Maximum link addition price, in cents.",
                  "disabled": true
                },
                {
                  "key": "linkAdditionLinkType",
                  "value": "string",
                  "description": "A comma-separated list of link types the link addition offer gives: `dofollow`, `nofollow`, `citation`.",
                  "disabled": true
                },
                {
                  "key": "recommended",
                  "value": "false",
                  "description": "`true`: only the medias Growwer recommends for the project; `false`: only the others.",
                  "disabled": true
                },
                {
                  "key": "favourite",
                  "value": "false",
                  "description": "`true`: only your favourites for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "requested",
                  "value": "false",
                  "description": "`true`: only the medias you requested for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "bought",
                  "value": "false",
                  "description": "`true`: only medias you bought for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "discarded",
                  "value": "false",
                  "description": "`true`: only the medias you discarded for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "new",
                  "value": "false",
                  "description": "Medias Growwer matched with the project recently. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "ranksGoalKeyword",
                  "value": "string",
                  "description": "A comma-separated list of keyword origins: medias that rank for a keyword of the project from any of them. `user`: your keywords; `publicGenerated`: keywords Growwer found for the project.",
                  "disabled": true
                },
                {
                  "key": "ranksAiKeyword",
                  "value": "string",
                  "description": "A comma-separated list of AI answer engines: medias cited for a keyword of the project by any of them. `googleAiOverview`, `chatgpt`, `googleAiMode`.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Medias per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Medias to skip, at most 99900.",
                  "disabled": true
                }
              ]
            },
            "description": "The medias on a flash offer, a time-limited discount, in the catalogue of one of your projects. It is GET /projects/{id}/medias with `flashOffer=true`, and takes the same parameters except `flashOffer` and `savedFilterId`. The catalogue access and the daily distinct-media limit of that operation apply."
          }
        },
        {
          "name": "Get a media",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/medias/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "medias",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The media."
                }
              ]
            },
            "description": "One media of the catalogue: an active, public media. A media you have ordered is always readable, even if it has since left the catalogue, and is open to every account. Otherwise the catalogue is open to accounts with recent completed orders (see `catalogue.eligible` on GET /me), and the media counts towards the distinct medias the account may see per day (UTC). For the media's state in one of your projects, search the project with GET /projects/{id}/medias."
          }
        },
        {
          "name": "Discard a media for a project",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/discards/:mediaId",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "discards",
                ":mediaId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                },
                {
                  "key": "mediaId",
                  "value": "",
                  "description": "The media."
                }
              ]
            },
            "description": "Discards a media for one of your projects, as the web does. Discarding it again changes nothing. The media must be one the catalogue shows for the project: another media, including one of your own as a seller, is answered as not found."
          }
        },
        {
          "name": "Restore a discarded media for a project",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/discards/:mediaId",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "discards",
                ":mediaId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                },
                {
                  "key": "mediaId",
                  "value": "",
                  "description": "The media."
                }
              ]
            },
            "description": "Restores a media you discarded for one of your projects. Restoring one that is not discarded changes nothing. It works for any media, even one the catalogue no longer shows."
          }
        },
        {
          "name": "Add a media to the favourites of a project",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/favourites/:mediaId",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "favourites",
                ":mediaId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                },
                {
                  "key": "mediaId",
                  "value": "",
                  "description": "The media."
                }
              ]
            },
            "description": "Marks a media as a favourite of one of your projects, as the heart on the web does. Adding a favourite again changes nothing. The media must be one the catalogue shows for the project: another media, including one of your own as a seller, is answered as not found."
          }
        },
        {
          "name": "Remove a media from the favourites of a project",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/favourites/:mediaId",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "favourites",
                ":mediaId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                },
                {
                  "key": "mediaId",
                  "value": "",
                  "description": "The media."
                }
              ]
            },
            "description": "Removes a media from the favourites of one of your projects. Removing one that is not a favourite changes nothing. It works for any media, even one the catalogue no longer shows."
          }
        },
        {
          "name": "Request specific medias for a project",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/media-requests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "media-requests"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                }
              ]
            },
            "description": "Asks Growwer to find the medias of these domains for one of your projects, as the \"request specific domains\" form on the web does. Each entry may be a domain or a URL; it is read as its full domain, lowercased. Repeated domains are requested once, and a domain already requested changes nothing. Up to 200 distinct domains per call. They then appear in the project's catalogue with `project.requested` true (`requested=true` on GET /projects/{id}/medias) once Growwer lists them.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"domains\": [\n    \"example.com\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Search the catalogue for a project",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id/medias",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id",
                "medias"
              ],
              "query": [
                {
                  "key": "source",
                  "value": "all",
                  "description": "Which of the project's medias to search: `all` (the default), `recommended` (those Growwer recommends for the project), or those you marked `favourite`, `discarded` or `requested`, or `bought` for the project. Do not combine it with the parameter of the same state.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-growwerRank",
                  "description": "The order. Without it, the web's default order: medias on the project's topic and language first, then best sellers and medias with more published orders. Ties are always broken by media id, so pages never overlap. `-growwerRank`: best match first; `postPrice`, `linkAdditionPrice`: cheapest first; `matchedAt`, `-matchedAt`: when Growwer matched the media with the project; `-traffic`, `-domainRating`, `-referringDomains`: highest first; `linkedToReferringRatio`: lowest first.",
                  "disabled": true
                },
                {
                  "key": "savedFilterId",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": "Apply one of your saved filters of this project, including one saved on the web, instead of the other parameters. Do not combine it with any filter, `source` or `sort`. A filter saved on the web that uses a filter the API does not support is refused with 422 `saved_filter_unsupported`.",
                  "disabled": true
                },
                {
                  "key": "domain",
                  "value": "string",
                  "description": "Medias whose domain contains this text, 1 to 255 characters.",
                  "disabled": true
                },
                {
                  "key": "websiteType",
                  "value": "string",
                  "description": "A comma-separated list of website types: `blog`, `press`.",
                  "disabled": true
                },
                {
                  "key": "language",
                  "value": "string",
                  "description": "A comma-separated list of language codes, as in GET /vocabulary.",
                  "disabled": true
                },
                {
                  "key": "country",
                  "value": "string",
                  "description": "A comma-separated list of country codes, as in GET /vocabulary.",
                  "disabled": true
                },
                {
                  "key": "topics",
                  "value": "string",
                  "description": "A comma-separated list of topic ids, as in GET /vocabulary: medias on any of them.",
                  "disabled": true
                },
                {
                  "key": "notBannedTopics",
                  "value": "false",
                  "description": "Leave out medias that refuse the topic of the project. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "minTraffic",
                  "value": "0",
                  "description": "Minimum monthly organic traffic.",
                  "disabled": true
                },
                {
                  "key": "maxTraffic",
                  "value": "0",
                  "description": "Maximum monthly organic traffic.",
                  "disabled": true
                },
                {
                  "key": "trafficTrendUpward",
                  "value": "false",
                  "description": "Medias whose traffic is growing. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "minDomainRating",
                  "value": "0",
                  "description": "Minimum domain rating, 0 to 100.",
                  "disabled": true
                },
                {
                  "key": "maxDomainRating",
                  "value": "0",
                  "description": "Maximum domain rating, 0 to 100.",
                  "disabled": true
                },
                {
                  "key": "minLinkedToReferringRatio",
                  "value": "0",
                  "description": "Minimum ratio of linked domains to referring domains, such as 0.5.",
                  "disabled": true
                },
                {
                  "key": "maxLinkedToReferringRatio",
                  "value": "0",
                  "description": "Maximum ratio of linked domains to referring domains, such as 1.5.",
                  "disabled": true
                },
                {
                  "key": "minPostPrice",
                  "value": "0",
                  "description": "Minimum post price, in cents.",
                  "disabled": true
                },
                {
                  "key": "maxPostPrice",
                  "value": "0",
                  "description": "Maximum post price, in cents.",
                  "disabled": true
                },
                {
                  "key": "postLinkType",
                  "value": "string",
                  "description": "A comma-separated list of link types the post offer gives: `dofollow`, `nofollow`, `citation`.",
                  "disabled": true
                },
                {
                  "key": "promotedSocialNetwork",
                  "value": "string",
                  "description": "A comma-separated list of social networks the media promotes posts on: `twitter`, `instagram`, `facebook`, `pinterest`, `tumblr`, `newsletter`.",
                  "disabled": true
                },
                {
                  "key": "withoutAdvertisingLabel",
                  "value": "false",
                  "description": "Medias that never label posts as advertising. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "homepageListing",
                  "value": "false",
                  "description": "Medias that offer listing the post on their homepage. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "hasLinkAddition",
                  "value": "false",
                  "description": "Medias that offer adding a link to an existing article. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "minLinkAdditionPrice",
                  "value": "0",
                  "description": "Minimum link addition price, in cents.",
                  "disabled": true
                },
                {
                  "key": "maxLinkAdditionPrice",
                  "value": "0",
                  "description": "Maximum link addition price, in cents.",
                  "disabled": true
                },
                {
                  "key": "linkAdditionLinkType",
                  "value": "string",
                  "description": "A comma-separated list of link types the link addition offer gives: `dofollow`, `nofollow`, `citation`.",
                  "disabled": true
                },
                {
                  "key": "recommended",
                  "value": "false",
                  "description": "`true`: only the medias Growwer recommends for the project; `false`: only the others.",
                  "disabled": true
                },
                {
                  "key": "favourite",
                  "value": "false",
                  "description": "`true`: only your favourites for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "requested",
                  "value": "false",
                  "description": "`true`: only the medias you requested for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "flashOffer",
                  "value": "false",
                  "description": "`true`: only medias with a flash offer running; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "bought",
                  "value": "false",
                  "description": "`true`: only medias you bought for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "discarded",
                  "value": "false",
                  "description": "`true`: only the medias you discarded for the project; `false`: leave them out.",
                  "disabled": true
                },
                {
                  "key": "new",
                  "value": "false",
                  "description": "Medias Growwer matched with the project recently. Only `true` applies it; omit it otherwise.",
                  "disabled": true
                },
                {
                  "key": "ranksGoalKeyword",
                  "value": "string",
                  "description": "A comma-separated list of keyword origins: medias that rank for a keyword of the project from any of them. `user`: your keywords; `publicGenerated`: keywords Growwer found for the project.",
                  "disabled": true
                },
                {
                  "key": "ranksAiKeyword",
                  "value": "string",
                  "description": "A comma-separated list of AI answer engines: medias cited for a keyword of the project by any of them. `googleAiOverview`, `chatgpt`, `googleAiMode`.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Medias per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Medias to skip, at most 99900.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The project."
                }
              ]
            },
            "description": "The medias the catalogue offers for one of your projects, as the web lists them, with each media's state in the project. Filter with the parameters below, which all combine, or apply one of your saved filters with `savedFilterId` alone. The catalogue is open to accounts with recent completed orders (see `catalogue.eligible` on GET /me), and each account can see a limited number of distinct medias per day (UTC) across the catalogue operations; medias seen again the same day are free."
          }
        }
      ]
    },
    {
      "name": "Files",
      "item": [
        {
          "name": "Upload a file",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/files",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "files"
              ]
            },
            "description": "Uploads a document (odt, doc, docx or txt, up to 8 MB) for a later write to reference by its `id`. A file belongs to you, can be used by one write, and expires 24 hours after it was uploaded; an expired or used file is answered like an unknown one.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": []
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Buyer money",
      "item": [
        {
          "name": "List your invoices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/invoices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Invoices per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Invoices to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "The invoices of your top-ups, newest first."
          }
        },
        {
          "name": "Download an invoice",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/invoices/:id/pdf",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id",
                "pdf"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The PDF of one of your invoices."
          }
        },
        {
          "name": "Get your buyer wallet",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/wallets/buyer",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "wallets",
                "buyer"
              ]
            },
            "description": "The balance you buy with, and the page where you top it up."
          }
        },
        {
          "name": "List your buyer wallet movements",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/wallets/buyer/transactions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "wallets",
                "buyer",
                "transactions"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Movements per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Movements to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "Every movement of your buyer wallet, newest first: top-ups, order debits and their refunds, gifts and manual corrections."
          }
        },
        {
          "name": "Download the document of a wallet movement",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/wallets/buyer/transactions/:id/document",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "wallets",
                "buyer",
                "transactions",
                ":id",
                "document"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The document Growwer attached to a movement of your buyer wallet. 404 when the movement has none (`hasDocument` is false) or the file cannot be read."
          }
        }
      ]
    },
    {
      "name": "Managed services",
      "item": [
        {
          "name": "Request a new campaign",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaign-requests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaign-requests"
              ]
            },
            "description": "Asks your account manager for a new campaign, as the managed service page does: the team emails you to agree on it. For accounts with a managed service (GET /me `managedService.active`); without one, POST /managed-service/info-requests asks about the service.\n\nYou may send 5 such requests per UTC day through the API. Past them it answers 429 `managed_service_request_limit_reached`, with `Retry-After` the time to the next UTC midnight. A request that is refused (4xx) does not count; one that fails on the server (5xx) does, as it may have been sent.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"projectUrl\": \"string\",\n  \"goal\": \"link_building\",\n  \"country\": \"string\",\n  \"duration\": \"one_time\",\n  \"estimatedBudget\": {\n    \"amount\": 12500,\n    \"currency\": \"EUR\"\n  },\n  \"additionalInfo\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "List your managed service campaigns",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaigns",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaigns"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Campaigns per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Campaigns to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "The campaigns your managed service runs for you, newest first. Without a managed service the list is empty: GET /me says whether you have one."
          }
        },
        {
          "name": "Get a managed service campaign",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaigns/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaigns",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Get a managed service campaign"
          }
        },
        {
          "name": "List the proposals of a campaign",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaigns/:id/proposals",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaigns",
                ":id",
                "proposals"
              ],
              "query": [
                {
                  "key": "state",
                  "value": "proposed,accepted",
                  "description": "Only proposals in these states, comma-separated: `proposed`, `accepted`, `cancelled`, `purchase_started`, `purchase_finished`.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Proposals per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Proposals to skip.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The medias the team proposes for the campaign, newest first. Those `proposed` await your review (POST /managed-service/campaigns/{id}/proposals/review)."
          }
        },
        {
          "name": "Download the summary of a campaign's proposals",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaigns/:id/proposals-summary",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaigns",
                ":id",
                "proposals-summary"
              ],
              "query": [
                {
                  "key": "extended",
                  "value": "false",
                  "description": "Whether to show the prices.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The PDF the campaign page offers: the proposals awaiting your review, accepted or being published, newest first, in your language. With `extended=true` it also shows each proposal's price, the price it was proposed at (`proposedPrice`)."
          }
        },
        {
          "name": "Estimate accepting proposals",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaigns/:id/proposals/estimate",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaigns",
                ":id",
                "proposals",
                "estimate"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Totals the campaign's accepted proposals that still await their order and the `proposed` ones you name in `accept`, and compares the total with your wallet's available balance. Each proposal counts at its `currentPrice`, or at its `proposedPrice` when the media no longer offers the service. Nothing is accepted, charged or reserved, so a read-only key may call it and it takes no Idempotency-Key.\n\nThe estimate is advisory: accepting a proposal charges nothing. The team charges your wallet when it places the order for an accepted proposal, and the same balance pays for the orders you place yourself.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"accept\": [\n    \"00000000-0000-0000-0000-000000000000\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Accept or reject proposals",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/campaigns/:id/proposals/review",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "campaigns",
                ":id",
                "proposals",
                "review"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Decides on every proposal of the campaign that awaits your review (`state` `proposed`), as the campaign page does: name each one once, with `accept` or `reject`, and a comment for the team to reject one. Their order in the body does not matter. Accepting charges nothing: the team places the orders for the accepted proposals and your wallet pays for them then. POST /managed-service/campaigns/{id}/proposals/estimate says what they would cost.\n\nWhen every proposal is accepted the campaign moves to `proposal_accepted`; when one is rejected the team is told and prepares others. A proposal someone else moved on the campaign page while the request ran is answered in the state it reached.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reviews\": [\n    {\n      \"proposalId\": \"00000000-0000-0000-0000-000000000000\",\n      \"decision\": \"accept\",\n      \"comment\": \"string\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Ask about the managed service",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/managed-service/info-requests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "managed-service",
                "info-requests"
              ]
            },
            "description": "Asks the team about the managed service for your website, as the managed service landing page does: the team contacts you. For accounts without a managed service (GET /me `managedService.active`); with one, POST /managed-service/campaign-requests requests a new campaign.\n\nYou may send 5 such requests per UTC day through the API. Past them it answers 429 `managed_service_request_limit_reached`, with `Retry-After` the time to the next UTC midnight. A request that is refused (4xx) does not count; one that fails on the server (5xx) does, as it may have been sent.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"projectUrl\": \"string\",\n  \"goal\": \"link_building\",\n  \"country\": \"string\",\n  \"duration\": \"one_time\",\n  \"estimatedBudget\": {\n    \"amount\": 12500,\n    \"currency\": \"EUR\"\n  },\n  \"additionalInfo\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Orders",
      "item": [
        {
          "name": "List your orders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/orders",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders"
              ],
              "query": [
                {
                  "key": "projectId",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": "Only the orders of this project of yours.",
                  "disabled": true
                },
                {
                  "key": "mediaId",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": "Only the orders on this media.",
                  "disabled": true
                },
                {
                  "key": "state",
                  "value": "pending_acceptance,pending_order_delivery",
                  "description": "Only the orders in one of these states, comma-separated. An unknown state is refused with 422 and the list of valid ones.",
                  "disabled": true
                },
                {
                  "key": "updatedSince",
                  "value": "2026-01-01T00:00:00+00:00",
                  "description": "Only the orders whose `updatedAt` is at or after this instant, an ISO-8601 date-time with its offset (send `+` as `%2B`).",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-createdAt",
                  "description": "`-createdAt`, newest first, or `updatedAt`, least recently changed first. Orders of the same instant come in id order.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Orders per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Orders to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "The orders you bought, newest first by default. To follow your orders, poll with `sort=updatedAt` and `updatedSince` set to the `updatedAt` of the last order you saw: an order moves to the end of that list each time it changes state."
          }
        },
        {
          "name": "Place an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders"
              ]
            },
            "description": "Places an order on a media for one of your projects and pays its price from your wallet's available balance, as ordering on the web does. Estimate the order first (POST /orders/estimate) and send the price it answers as `expectedPrice`: the order is placed only at that price.\n\nPlacing the same order (same project, media, type and price) again within 5 seconds of one still in progress is refused with `duplicate_order`. Its `details.orderId` is the earlier order, or null when that order has finished or was deleted since.\n\nA proposed draft (`proposedDraftFileId`, from POST /files) is used up when the order is placed. If the order is then refused because another request changed your balance, the media or its price, or placed the same order, the file is used up all the same and the refusal's message says so: upload it again before retrying.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"post\",\n  \"projectId\": \"00000000-0000-0000-0000-000000000000\",\n  \"mediaId\": \"00000000-0000-0000-0000-000000000000\",\n  \"briefing\": {\n    \"links\": [\n      {\n        \"targetUrl\": \"string\",\n        \"anchor\": \"string\",\n        \"type\": \"dofollow\"\n      }\n    ],\n    \"extraServices\": [\n      \"list_on_homepage\"\n    ],\n    \"title\": \"string\",\n    \"additionalInfo\": \"string\"\n  },\n  \"scheduledPublicationDate\": \"2026-01-01\",\n  \"draftReviewable\": false,\n  \"proposedDraftFileId\": \"00000000-0000-0000-0000-000000000000\",\n  \"expectedPrice\": {\n    \"amount\": 12500,\n    \"currency\": \"EUR\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Estimate an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/estimate",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                "estimate"
              ]
            },
            "description": "Checks and prices the order POST /orders would place with the same body, without `expectedPrice`, and compares the price with your wallet's available balance. Nothing is placed, charged or used up, so a read-only key may call it and it takes no Idempotency-Key. Send the `price` it answers as `expectedPrice` when you place the order.\n\nThe estimate is refused for the same reasons as the order itself, except a balance that does not cover the price: that is answered here with `sufficientBalance: false` and the `missing` amount.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"post\",\n  \"projectId\": \"00000000-0000-0000-0000-000000000000\",\n  \"mediaId\": \"00000000-0000-0000-0000-000000000000\",\n  \"briefing\": {\n    \"links\": [\n      {\n        \"targetUrl\": \"string\",\n        \"anchor\": \"string\",\n        \"type\": \"dofollow\"\n      }\n    ],\n    \"extraServices\": [\n      \"list_on_homepage\"\n    ],\n    \"title\": \"string\",\n    \"additionalInfo\": \"string\"\n  },\n  \"scheduledPublicationDate\": \"2026-01-01\",\n  \"draftReviewable\": false,\n  \"proposedDraftFileId\": \"00000000-0000-0000-0000-000000000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Get an order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "One order you bought, with its briefing, its draft and its state history."
          }
        },
        {
          "name": "Approve an order's delivery",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/approve",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "approve"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Approves the delivery of an order whose `pendingAction` is yours to review the delivery, as the web does. The order finishes and the seller is paid. It takes no body."
          }
        },
        {
          "name": "Approve a draft",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/approve-draft",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "approve-draft"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Approves the draft of a post order whose `pendingAction` is yours to review the draft (GET /orders/{id}/draft downloads it), as the web does. The seller then publishes it. It takes no body."
          }
        },
        {
          "name": "Download the draft you attached to an order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/briefing",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "briefing"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The file you attached to the briefing of a post order. 404 when the order has none (`briefing.hasProposedDraft` is false) or the file cannot be read."
          }
        },
        {
          "name": "Cancel an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/cancel",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Cancels an order the seller has not accepted yet (`state` `pending_acceptance`), as the web does. Its price returns to your wallet's available balance, and the seller is told your reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Download the draft of an order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/draft",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "draft"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The file of the current draft of a post order. 404 when the order has no draft file (`draft.hasFile` is false) or the file cannot be read."
          }
        },
        {
          "name": "Request changes to a draft",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/request-draft-update",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "request-draft-update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Asks the seller to change the draft of a post order whose `pendingAction` is yours to review the draft, as the web does. The seller is told your reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Request changes to a delivery",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/orders/:id/request-update",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "orders",
                ":id",
                "request-update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Asks the seller to change the delivery of an order whose `pendingAction` is yours to review the delivery, as the web does. The seller is told your reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Projects",
      "item": [
        {
          "name": "List your projects",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/projects",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Projects per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Projects to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "Your projects, newest first."
          }
        },
        {
          "name": "Create a project",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects"
              ]
            },
            "description": "Creates a project for a website, as the web's project creation does. Growwer then analyses it in the background to recommend media: the project is answered with `state: analyzing` and turns `finished` when the analysis ends. Analysis can take hours, and it never finishes when no medium matches the project, so poll GET /projects/{id} with backoff and use `createdAt` to decide when to stop.\n\nEvery value is validated as on the web: `topics`, `language` and `country` take the identifiers GET /vocabulary publishes.\n\nCreating a project also categorises its website through an external service, as the web does. When that service fails the answer is 500, although the project may already be saved, and a retry under the same Idempotency-Key answers 409 `idempotency_outcome_unknown`. After either, list your projects (GET /projects) before retrying with a new key, or you may create a duplicate.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"string\",\n  \"rootUrl\": \"https://www.example.com\",\n  \"websiteType\": \"ecommerce\",\n  \"topics\": [\n    0\n  ],\n  \"language\": \"es\",\n  \"country\": \"ES\",\n  \"promotedProducts\": [\n    \"string 1\",\n    \"string 2\",\n    \"string 3\",\n    \"string 4\",\n    \"string 5\"\n  ],\n  \"userKeywords\": [\n    \"string\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Get a project",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "One of your projects. Poll it to follow `state` after creating the project."
          }
        },
        {
          "name": "Edit a project",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Changes only the fields you send. `rootUrl` cannot be changed; any field not listed here is refused. Changing `language`, `country`, `promotedProducts` or `topics` makes Growwer categorise the project and work out its target keywords again, in the background.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"string\",\n  \"websiteType\": \"ecommerce\",\n  \"topics\": [\n    0\n  ],\n  \"language\": \"string\",\n  \"country\": \"string\",\n  \"promotedProducts\": [\n    \"string 1\",\n    \"string 2\",\n    \"string 3\",\n    \"string 4\",\n    \"string 5\"\n  ],\n  \"userKeywords\": [\n    \"string\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Delete a project",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/projects/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Deletes one of your projects. A project with an order in progress cannot be deleted until its orders finish."
          }
        }
      ]
    },
    {
      "name": "Seller medias",
      "item": [
        {
          "name": "List the medias you sell on",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/medias",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "medias"
              ],
              "query": [
                {
                  "key": "state",
                  "value": "active,deactivated",
                  "description": "Only the medias in one of these states, comma-separated: `analyzing`, `pending_review`, `active`, `deactivated`. An unknown state is refused with 422.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-createdAt",
                  "description": "By creation date, number of published orders or publication rate; a leading `-` sorts descending. Medias with no publication rate come first ascending, last descending. Ties come in id order.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Medias per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Medias to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "Your medias in every state, with your fees and how they perform, newest first by default."
          }
        },
        {
          "name": "Get a media you sell on",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/medias/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "medias",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "One of your medias, with your fees, its extras, the competitive fees Growwer suggests and how it performs. Another seller's media is not found."
          }
        },
        {
          "name": "Edit the fees of a media you sell on",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/medias/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "medias",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Sets the fees of one of your medias, as the media edit page saves them. Send only the sections you change: a section you send replaces that section wholly, a section you leave out stays as it is.\n\n- `postOffer.pricingOptions` lists every link type you offer for sponsored posts, at least one. A link type you leave out is no longer offered. Each option needs at least one fee, and every option must offer the same sides (written by you, written by the buyer or Growwer), as the page requires. Each fee is at least 1 EUR.\n- `linkAdditionOffer.pricingOptions` lists the link types you offer for adding a link to an existing article; `null` or an empty list stops offering link additions.\n- `extraServices` is the full list of extra services you offer; an empty list removes them all.\n\nThe fees are your base fees, the ones GET /seller/medias/{id} returns: while a flash offer runs, its discount keeps applying on top of them, and `currentCost` shows the result. `currentCost` may be sent back as read and is ignored. Characteristics, topics and comments are not edited here.\n\nAs on the page, a change of the post offer's price may cancel the managed-service proposals accepted for the media whose price it changes, and raising the price above the best competitor's tells Growwer's support team. A restricted seller account may edit its fees.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"postOffer\": {\n    \"pricingOptions\": [\n      {\n        \"linkType\": \"dofollow\",\n        \"feeWhenSellerWritesPost\": {\n          \"amount\": 12000,\n          \"currency\": \"EUR\"\n        },\n        \"feeWhenSellerDoesNotWritePost\": {\n          \"amount\": 10000,\n          \"currency\": \"EUR\"\n        }\n      },\n      {\n        \"linkType\": \"nofollow\",\n        \"feeWhenSellerWritesPost\": {\n          \"amount\": 9000,\n          \"currency\": \"EUR\"\n        },\n        \"feeWhenSellerDoesNotWritePost\": {\n          \"amount\": 7000,\n          \"currency\": \"EUR\"\n        }\n      }\n    ]\n  },\n  \"linkAdditionOffer\": null,\n  \"extraServices\": [\n    {\n      \"name\": \"list_on_homepage\",\n      \"cost\": {\n        \"amount\": 5000,\n        \"currency\": \"EUR\"\n      }\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Set the competitive fees Growwer suggests",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/medias/:id/apply-competitive-fees",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "medias",
                ":id",
                "apply-competitive-fees"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Sets your post fees for the media to the competitive fees Growwer suggests, the `competitiveFees` of GET /seller/medias/{id}, as the button on the media edit page does. Each link type you offer gets the suggested fee on each side it already has a fee for; no link type gains a side it did not offer.\n\nTwo differences from the page: a side Growwer has no suggestion for keeps your fee (the page clears it), and the fixed fee the page falls back to when it cannot find a competitive one is never applied (the page applies it). When neither side has a suggestion, nothing changes and the answer is 409 `no_competitive_fees`. When your fees already are the suggested ones, or the suggestion is only for a side none of your link types offers, nothing changes and the answer is 200.\n\nThe fees set are your base fees: a running flash offer keeps discounting them. As with a fee edit, a change of the price may cancel the managed-service proposals accepted for the media whose price it changes. Send no body, or an empty object."
          }
        }
      ]
    },
    {
      "name": "Seller money",
      "item": [
        {
          "name": "Get your seller wallet",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/wallets/seller",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "wallets",
                "seller"
              ]
            },
            "description": "What your sales have earned: the balance you can withdraw now and what is held until orders settle. `restricted` is true while your seller account is restricted; the reason is not published here, and support can tell you more."
          }
        },
        {
          "name": "List your seller wallet movements",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/wallets/seller/transactions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "wallets",
                "seller",
                "transactions"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Movements per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Movements to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "Every movement of your seller wallet, newest first: earnings from orders, withdrawals and manual corrections. An earning names its order (`orderId`) and a withdrawal its request (`withdrawalId`)."
          }
        },
        {
          "name": "Download the document of a seller wallet movement",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/wallets/seller/transactions/:id/document",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "wallets",
                "seller",
                "transactions",
                ":id",
                "document"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The document Growwer attached to a movement of your seller wallet. 404 when the movement has none (`hasDocument` is false) or the file cannot be read."
          }
        },
        {
          "name": "List your withdrawals",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/withdrawals",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "withdrawals"
              ],
              "query": [
                {
                  "key": "state",
                  "value": "started",
                  "description": "Only the withdrawals in one of these states, comma-separated: `started`, `approved`, `rejected`. An unknown state is refused with 422.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Withdrawals per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Withdrawals to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "The withdrawals you requested from your seller wallet, newest first. Requesting a withdrawal is not available through the API; use the seller wallet page."
          }
        },
        {
          "name": "Download the invoice of a withdrawal",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/withdrawals/:id/invoice",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "withdrawals",
                ":id",
                "invoice"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The invoice you uploaded for one of your withdrawals, named `withdrawal-{id}-invoice.pdf`. 404 when the withdrawal has none (`hasInvoice` is false); 503 `storage_unavailable` when the file cannot be read right now."
          }
        }
      ]
    },
    {
      "name": "Seller orders",
      "item": [
        {
          "name": "List the orders you sell",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders"
              ],
              "query": [
                {
                  "key": "mediaId",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": "Only the orders on this media of yours.",
                  "disabled": true
                },
                {
                  "key": "state",
                  "value": "pending_acceptance,pending_order_delivery",
                  "description": "Only the orders in one of these states, comma-separated. An unknown state is refused with 422 and the list of valid ones.",
                  "disabled": true
                },
                {
                  "key": "updatedSince",
                  "value": "2026-01-01T00:00:00+00:00",
                  "description": "Only the orders whose `updatedAt` is at or after this instant, an ISO-8601 date-time with its offset (send `+` as `%2B`).",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-createdAt",
                  "description": "`-createdAt`, newest first, or `updatedAt`, least recently changed first. Orders of the same instant come in id order.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Orders per page, 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Orders to skip.",
                  "disabled": true
                }
              ]
            },
            "description": "The orders placed on your medias, newest first by default. To follow them, poll with `sort=updatedAt` and `updatedSince` set to the `updatedAt` of the last order you saw: an order moves to the end of that list each time it changes state. The orders you bought are under GET /orders."
          }
        },
        {
          "name": "Get an order you sell",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "One order placed on one of your medias, with its briefing, its draft and its state history. An order you only bought is not found here; it is under GET /orders/{id}."
          }
        },
        {
          "name": "Accept an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/accept",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "accept"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Accepts an order placed on one of your medias (`state` `pending_acceptance`), as the web does. A post order whose draft is still to be written (by you or by Growwer) moves to `pending_draft`; any other order moves to `pending_order_delivery`. The buyer is told. Takes no body."
          }
        },
        {
          "name": "Download the draft the buyer attached to an order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/briefing",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "briefing"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The file the buyer attached to the briefing of a post order you sell. 404 when the order has none (`briefing.hasProposedDraft` is false) or the file cannot be read."
          }
        },
        {
          "name": "Deliver an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/deliver",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "deliver"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Delivers an order placed on one of your medias (`state` `pending_order_delivery`), as the web does. A post order takes the URL of the published post and the confirmation of its publication date; a link addition order takes no body, and any field is refused. The order moves to `pending_order_delivery_review` and the buyer is asked to review it, or, for a post order whose scheduled publication date is still to come, to `scheduled` without telling the buyer yet. The URL is checked to be a URL only, as the web does.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\",\n  \"publicationDateConfirmed\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Deliver a draft",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/deliver-draft",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "deliver-draft"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Delivers the draft of a post order placed on one of your medias whose draft you write (`state` `pending_draft`), as the web does, from a file you uploaded with POST /files. The order moves to `pending_draft_review` when the buyer reviews drafts, otherwise to `pending_order_delivery`. The file is used up once the draft is delivered; a refused request leaves it usable.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fileId\": \"00000000-0000-0000-0000-000000000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Deliver a draft update",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/deliver-draft-update",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "deliver-draft-update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Delivers the draft update the buyer asked for on a post order placed on one of your medias whose draft you write (`state` `pending_draft_update`), as the web does, from a file you uploaded with POST /files. The order moves back to `pending_draft_review`. The file is used up once the draft is delivered; a refused request leaves it usable.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fileId\": \"00000000-0000-0000-0000-000000000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Deliver an update",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/deliver-update",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "deliver-update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Delivers the update the buyer asked for on an order placed on one of your medias (`state` `pending_order_delivery_update`), as the web does. A post order takes the URL of the published post, which may be the same as before, and the confirmation of its publication date; both must be sent. A link addition order takes no body, and any field is refused. The order moves back to `pending_order_delivery_review` and the buyer is asked to review it.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\",\n  \"publicationDateConfirmed\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Download the draft of an order you sell",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/draft",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "draft"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "The file of the current draft of a post order you sell. 404 when the order has no draft file (`draft.hasFile` is false) or the file cannot be read. Earlier drafts are not available."
          }
        },
        {
          "name": "Refuse a draft update",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/refute-draft-update",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "refute-draft-update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Refuses the draft update the buyer asked for on a post order placed on one of your medias whose draft you write (`state` `pending_draft_update`), as the web does. The order moves back to `pending_draft_review` and the buyer is told your reason. A draft Growwer or the buyer writes cannot be refused here.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Refuse an update",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/refute-update",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "refute-update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Refuses the update the buyer asked for on an order placed on one of your medias (`state` `pending_order_delivery_update`), as the web does. The order moves back to `pending_order_delivery_review` and the buyer is told your reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"example example\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Reject an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each write, reused only to retry that same write. 1 to 255 printable ASCII characters without spaces (`!` to `~`); any other value answers 400 `invalid_idempotency_key`."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/seller/orders/:id/reject",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "seller",
                "orders",
                ":id",
                "reject"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Rejects an order placed on one of your medias that you have not accepted yet (`state` `pending_acceptance`), as the web does. The order moves to `rejected_by_seller`, its price returns to the buyer, and the buyer is told your reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": {\n    \"name\": \"media_is_competition\",\n    \"additionalInfo\": \"example example\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    }
  ]
}
