IndyWriters

Enabling newsletter platforms to offer easy and fair cross-promotion to their writers.

To gain access, connect with Ben J. Clarke at LinkedIn.

IndyWriters works on a simple principle - if a newsletter sends a reader to a cross-promotion partner, then that newsletter should receive a new reader in return.

Ordinarily this restricts newsletters to cross-promoting with similar sized peers, greatly reducing the pool of potential partners. IndyWriters solves this problem by allowing newsletters to aggregate their cross-promotion.

Instead of only linking to one cross-promotion partner, newsletters can link to a list of several. Each partner in this list is scored for its likely relevance to the referring newsletter's readers, and the list is calibrated so that partners who contribute the most also receive the most.

Cross-promotion between newsletters is thus converted from a one-to-one relationship to a many-to-many relationship. IndyWriters works in the background to ensure that the give and take, however, is 1:1. If a newsletter sends a new reader, then it receives one in return.

How it works

For newsletter platforms, the API documentation below will guide you through the IndyWriter's functionality . Styles and usage may vary depending on how you choose to use the system.

For newsletter writers, cross-promoting with IndyWriters is simple (explainer graphic here) as including a unique link in their posts. The banner (and below code snippet - remember to change the href) are suggested, but you may style things to your own preferences:

<div style="background-color: #04160b; text-align: center; padding: 60px;">
  <div style="width: 400px; margin: auto; color: #ffffff; font-family: Fira Sans, Lucida Sans Unicode, Lucida Grande, sans-serif; line-height: 1.2; text-align: center;">
    <h1 style="color: #ffffff; font-size: 44px; font-weight: 700; margin-bottom: 10px; margin-top: 0;">Find Other Great Newsletters</h1>
    <p style="margin-bottom: 30px;">Brilliant writing should be easy to find</p>
    <a href="[newslettter's unique link (given to you upon creation)]" target="_blank" style="display: inline-block;
        color:#1e3004;
        text-decoration: none;
          background-color: #bffb3f; color: #1e3004; font-size: 16px; font-weight: 400; padding: 20px; text-align: center; width: auto; word-break: keep-all;">View cross-promos</a>
  </div>
</div>

Find Other Great Newsletters

Brilliant writing should be easy to find

View cross-promos

API documentation

Indywriters works as a backend API for cross-promotion. Newsletter platforms (members) incorporate it into their systems so that their users can cross-promote with others. This cross-promotion is across all of IndyWriters' members.

Data is created, read, updated and deleted by member platforms. Their newsletter writers do not hold user accounts on IndyWriters, but interact with our system and data via tools that our members build into their systems.

Requests must be made with https, and curl multipart/form-data (as in the examples) is highly recommended - functionality is not tested for any other way.

Create a new newsletter

Although newsletter writers do not hold user accounts, it is necessary for newsletters to be created as objects in the IndyWriters database. These can be created and deleted by member platforms at will.

Upon creation, new newsletters will be reviewed to ensure that they are appropriate - i.e. are not grossly offensive, disreputable, etc.

To create a new newsletter object in IndyWriters use the curl below:

  • title is mandatory and must be 75 characters or less.
  • tagline is mandatory and must be 255 characters or less.
  • url is mandatory, must be unique, and must use https://.
  • logo is mandatory and must be uploadable to IndyWriters.
  • topic_list is technically optional but highly recommended. It helps IndyWriters to score cross-promotion relevance right away - i.e. before the newsletter has generated enough cross-promotion data to utilize.
  • external_id is an optional field for your use in matching the object to a newsletter in your database.
        
curl -X POST https://indywriters.com/api/newsletters/ \
  -H "Username: XXXX" \
  -H "API-Key: XXXXXXXX" \
  -F "title=Newsletter Title" \
  -F "tagline=An awesome newsletter that everybody will love reading" \
  -F "url=https://awesomenewsletter.blog" \
  -F "logo=@/path/to/resource" \
  -F "topic_list=tech, ai" \
  -F "external_id=XXXX"
        
      

Expected response if POST is successful:

        
{
"message": "Newsletter created and pending review.",
"newsletter":{
          "external_id":"your internal id for the newsletter",
          "reference":"1AUqWb4",
          "cross_promotion_link": "https://indywriters.com/links/list/1AUqWb4/",
          "title":"Newsletter Title",
          "tagline":"An awesome newsletter that everybody will love reading.",
          "url":"https://awesomenewsletter.blog",
          "logo":"URL of image on IndyWriters",
          "topics":["tech", "ai"],
          "active":false,
          "created":"2025-07-14T21:33:22.994548Z"
          }
}
        
      

Three of these return values should be noted:

  • reference is the public id for the newsletter and will be used for read, update and delete.
  • cross_promotion_link is the link that newsletters must include in their posts to use the system.
  • active flags if the newsletter is approved and eligible to receive cross-promotions from others. The newsletter may use its cross_promotion_link immediately (and should so that it will be owed clicks).

Update a specific newsletter

All updates are subject to the same review as new objects - a basic check to ensure the system is safe for all users. As such edits are made to a staging model - note the api/newsletter-edits route.

Updating is done via PATCH requests. title, tagline and logo can be changed easily. For the following:

  • url must be unique among newsletters you control.
  • To set topic_list and external_id to null use:
    • -F "topic_list="
    • -F "external_id="
        
curl -X PATCH https://indywriters.com/api/newsletter-edits/[reference]/ \
  -H "Username: XXXX" \
  -H "API-Key: XXXXXXXX" \
  -F "title=Newsletter Title" \
  -F "tagline=An awesome newsletter that everybody will love reading" \
  -F "url=https://awesomenewsletter.blog" \
  -F "logo=@/path/to/resource" \
  -F "topic_list=tech, ai" \
  -F "external_id=XXXX"
        
      

Expected response if PATCH is successful:

        
{
"message": "Newsletter edit requested and pending review.",
"newsletter":{
          "external_id":"your internal id for the newsletter",
          "reference":"1AUqWb4",
          "cross_promotion_link": "https://indywriters.com/links/list/1AUqWb4/",
          "title":"Newsletter With Edited Title",
          "tagline":"An awesome newsletter that everybody will love reading.",
          "url":"https://awesomenewsletter.blog",
          "logo":"URL of image on IndyWriters",
          "topics":["tech", "ai"],
          "approved":false,
          "created":"2025-07-14T21:33:22.994548Z"
          }
}
        
      

Delete a specific newsletter

Newsletter objects that you create on IndyWriters are administered by you. Only in exceptional circumstances - such as abuse of the system - will IndyWriters get involved. As such, you may delete newsletters at will.

Deletion is permanent, unrecoverable, and cascades - data associated with the newsletter will also be deleted.

        
curl -X DELETE https://indywriters.com/api/newsletters/[reference]/ \
  -H "Username: XXXX" \
  -H "API-Key: XXXXXXXX"
        
      

Expected response if DELETE is successful:

        
{
"message": "Newsletter deleted.",
"newsletter":{
          ...
          }
}
        
      

Read all newsletters you manage

        
curl -X GET https://indywriters.com/api/newsletters/ \
  -H "Username: XXXX" \
  -H "API-Key: XXXXXXXX"
        
      

Read a specific newsletter

        
curl -X GET https://indywriters.com/api/newsletters/[reference]/ \
  -H "Username: XXXX" \
  -H "API-Key: XXXXXXXX"
        
      

Reading data on newsletter performance

Newsletter writers will probably like to see evidence that their cross-promotions are working. UTM params are in place to show that referrals have come from IndyWriters (and your platform), but it's useful for you to be able to present data to your users.

The currency of IndyWriters is clicks - i.e. readers of one newsletter clicking through to see that of a cross-promotion partner. You can read click data using the following curl, where the "days" param indicates how many days before present the data should reflect (default=30):

To see clicks for all newsletters you've created, remove the [reference].

        
curl -X GET https://indywriters.com/api/clicks/[reference]/?days=20/ \
  -H "Username: XXXX" \
  -H "API-Key: XXXXXXXX"
        
      
The expected response will look like the below, where origin is the newsletter that referred and destination is the newsletter that received. References for origin and destination will only be given if the newsletter is administered by one of your users:
        
[
  {
    "origin_reference":null,
    "origin_url":"https://origin_url.com",
    "destination_reference":"kDpaqSC",
    "destination_url":"https://destination_url.com",
    "created":"2025-07-15T09:55:59.633994Z"
  }
  {
    "origin_reference":"JryiRe",
    "origin_url":"https://origin_url.com",
    "destination_reference":"kDpaqSC",
    "destination_url":"https://destination_url.com",
    "created":"2025-07-15T09:55:59.633994Z"
  }
]