I would ask API users to enter "*", i.e. typedef struct, not a pointer to a structure. This is a widely used style in GLib, which is one of C's most popular stacks.
This works well because it is important to know if you have a pointer to a structure or a structure. For example, can you store NULL in a type variable? If you hide that the object is a pointer, you need to create a special NIL_NODE or another value to replace NULL. If you just make it a pointer, then people can treat it as one.
Another important advantage is the ability to put the actual definition of the structure somewhere private, that is, in the .c file, and not in the header. You can only put typedef in the header, while keeping the structure opaque to users of the API. This requires people to use only the exported methods that you provide for structure management. It also means that you do not need to restore the world if you change the structure fields.
Another reason for this path is that sometimes you need a structure that can be copied, and you still want to print it. Take something like GdkPoint:
typedef struct { int x, y; } GdkPoint;
It is useful to allow direct access to the structure, for example:
GdkPoint point = { 10, 10 }; GdkPoint copy = point; do_stuff_with_point(©);
However, if your convention is that typedef "GdkPoint" be a pointer, you will have to be inconsistent.
The code is simply clear if you can indicate which pointer and what is not, and the code is better encapsulated if you do not put the definition of struct in the header (for structures that represent abstract, opaque data types, which is probably the most common type).
My default template for the data type C in the header looks something like this:
typedef struct MyType MyType; MyType* my_type_new(void); void my_type_unref(MyType *t); void my_type_ref(MyType *t);
Then the actual "struct MyType" in the .c file, as well as the new, unref and any type operations.
An exception will be for such types as Point, Rectangle, Color, where "simple old data" and direct access to fields are desirable; another option is to have my_type_free () instead of _unref () if you don't need a recount.
In any case, this is one style, mainly the GLib style, which is widely used and, as you know, works well.